Doruk Karaca
Doruk Karaca

Reputation: 3

Django Custom Validation

I am new bie in Django, I used MultiModelForm in my application and change selectbox field as textbox. When I try to save form, I am getting validation error (Select a valid choice. That choice is not one of the available choices.) because validation requires equipment_id instead of equipment_tagname. Please help me to find the way

Models.py

from django.db import models
from core.models import MyUser
from django.db.models import Max
from datetime import datetime


class System(models.Model):
    system_tagname = models.CharField(max_length=20, blank=False, verbose_name="Etiket", unique=True)
    system_content = models.CharField(max_length=50, blank=False, verbose_name="Açıklama", unique=True)

    def __str__(self):
        return "%s %s" % (self.system_tagname, self.system_content)


class SubSystem(models.Model):
    system = models.ForeignKey(System, on_delete=models.CASCADE, verbose_name="Ana Sistem", related_name="systems")
    subsystem_tagname = models.CharField(max_length=20, blank=False, verbose_name="Etiket", unique=True)
    subsystem_content = models.CharField(max_length=50, blank=False, verbose_name="Açıklama", unique=True)

    def __str__(self):
        return "%s %s" % (self.subsystem_tagname, self.subsystem_content)


class Equipment(models.Model):
    subsystem = models.ForeignKey(SubSystem, on_delete=models.CASCADE, verbose_name="Alt Sistem",
                                  related_name="equipments")
    equipment_tagname = models.CharField(max_length=20, blank=False, verbose_name="Etiket", unique=True)
    equipment_content = models.CharField(max_length=50, blank=False, verbose_name="Açıklama", unique=True)

    def __str__(self):
        return "%s" % (self.equipment_tagname)


class WorkStatus(models.Model):
    status_name = models.CharField(max_length=20)


class WorkRequest(models.Model):
    work = models.CharField(max_length=200, blank=False, verbose_name="Açıklama")
    equipment = models.ForeignKey(Equipment, on_delete=models.SET_NULL, null=True, verbose_name="Ekipman", blank=False,
                                  related_name="equipment", )
    reported_user = models.ForeignKey(MyUser, on_delete=models.SET_NULL, null=True, verbose_name="Raporlayan",
                                      related_name="reported_users", blank=True)
    created_date = models.DateTimeField(auto_now_add=True, verbose_name="Açılma Tarihi")
    modified_date = models.DateTimeField(auto_now=True, verbose_name="Son Güncelleme")
    closing_comment = models.CharField(max_length=300, verbose_name="Kapanış Yorumu", blank=True)
    status=models.ForeignKey(WorkStatus,on_delete=models.SET_NULL,null=True, blank=True, verbose_name="İşin Durumu",related_name="status")

class WorkerGroup(models.Model):
    name = models.CharField(max_length=20, unique=True, blank=False)
    request = models.ForeignKey(WorkRequest, on_delete=models.SET_NULL, null=True, related_name="request")

class Worker(models.Model):
    name = models.OneToOneField(MyUser, on_delete=models.CASCADE, primary_key=True)
    group = models.ForeignKey(WorkerGroup, on_delete=models.SET_NULL, null=True)

class WorkComment(models.Model):
    comment_content = models.CharField(max_length=150000, verbose_name="İş Yorumları", blank=True, null=True)
    comment_author = models.ForeignKey(MyUser, on_delete=models.SET_NULL, null=True, related_name="authors", blank=True)
    comment_work = models.ForeignKey(WorkRequest, on_delete=models.CASCADE, related_name="workorder", blank=True,null=True)

views.py

def addWorkOrder(request):
    if request.user.status.name == "ADMIN":
        form = AllRequestForm(request.POST or None)
        if form.is_valid():
            workrequest = form['workrequest'].save(commit=False)
            workrequest.status = WorkStatus.objects.get(id=1)
            equipment = form.cleaned_data.get("equipment")
            workrequest.equipment =equipment
            workrequest.save()
            workcomment = form['workcomment'].save()
            messages.success(request, "Ana Ekipman başarı ile oluşturuldu...")
            return redirect('workorders:systemlist')
        return render(request, "add_workorder.html", {'form': form})
    else:
        return render(request, 'unauthorized.html')

forms.py

from django import forms
from .models import System, SubSystem, Equipment, WorkComment,WorkRequest,WorkStatus
from betterforms.multiform import MultiModelForm
from django_summernote.widgets import SummernoteWidget, SummernoteInplaceWidget


class SystemForm(forms.ModelForm):
    class Meta:
        model = System
        fields = ["system_tagname", "system_content"]

        error_messages = {
            'system_tagname': {
                'unique': ("Girmiş olduğunuz sistem etiketi daha önce kullanılmıştır."),

            },
            'system_content"': {
                'unique': ("Girmiş olduğunuz sistem açıklaması daha önce kullanılmıştır."),
            }
        }


class SubSystemForm(forms.ModelForm):
    class Meta:
        model = SubSystem
        fields = ["system", "subsystem_tagname", "subsystem_content"]

        error_messages = {
            'subsystem_tagname': {
                'unique': ("Girmiş olduğunuz alt sistem etiketi daha önce kullanılmıştır."),

            },
            'subsystem_content"': {
                'unique': ("Girmiş olduğunuz alt sistem açıklaması daha önce kullanılmıştır."),
            }
        }


class SubForm(forms.ModelForm):
    class Meta:
        model = SubSystem
        fields = ["system"]


class EquipmentForm(forms.ModelForm):
    class Meta:
        model = Equipment
        fields = ["subsystem", "equipment_tagname", "equipment_content"]

        error_messages = {
            'equipment_tagname': {
                'unique': ("Girmiş olduğunuz ekipman etiketi daha önce kullanılmıştır."),

            },
            'subsystem_content"': {
                'unique': ("Girmiş olduğunuz ekipman açıklaması daha önce kullanılmıştır."),
            }
        }


class AllSystemForm(MultiModelForm):
    form_classes = {
        'subsystem': SubForm,
        'equipment': EquipmentForm,
    }

class WorkRequestForm(forms.ModelForm):
    class Meta:
        model = WorkRequest
        fields = '__all__'
        widgets={
            'equipment': forms.TextInput
         }

class WorkStatusForm(forms.ModelForm):
    class Meta:
        model = WorkStatus
        fields = []


class WorkCommentForm (forms.ModelForm):
    class Meta:
        model = WorkComment
        fields = ["comment_content"]
        widgets = {
            'comment_content': SummernoteWidget()
        }



class AllRequestForm(MultiModelForm):
    form_classes = {
        'workrequest': WorkRequestForm,
        'workcomment': WorkCommentForm,
    }

    def clean_equipment(self):
        equip = self.cleaned_data.get("equipment")
        equipment = Equipment.objects.get(equipment_tagname=equip)
        return  equipment

Upvotes: 0

Views: 150

Answers (0)

Related Questions