Как сравнить значение внешнего ключа базы данных со значением внешнего ключа формы в Django? - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть проект Django , и я столкнулся с проблемой сравнения атрибута внешнего ключа базы данных с атрибутом внешнего ключа формы. Файлы моего проекта ниже:

Мой файл Model.py:

class Teacher(models.Model):
    Name            = models.CharField(max_length=100)
    Designation     = models.CharField(max_length=100,choices=DESIGNATION)
    Department      = models.CharField(max_length=100,choices=T_Dept)
    Address         = models.CharField(max_length=100)

    def __str__(self):
        return self.Name + ", " + self.Designation + ", " + "("+self.Department +"), "+ self.Address

class Moderation(models.Model):
    year        = models.CharField(max_length=100,choices=T_Year)
    semester    = models.CharField(max_length=100,choices=T_Semester)
    examtype    = models.CharField(max_length=30,choices=EXAMTYPE)
    examyear    = models.CharField(max_length=30,choices=EXAMYEAR)
    NamAdd      = models.ForeignKey(Teacher, on_delete=models.CASCADE)
    position    = models.CharField(max_length=100,choices=POSITON)


    def __str__(self):
        return unicode(self.NamAdd)

Мой файл forms.py:

class modaForm(forms.ModelForm):
class Meta:
    model=Moderation
    fields=[
        'year',
        'semester',
        'NamAdd',
        'position','examtype','examyear'
    ]

Мой HTML-файл:

<form action="{% url 'modIni' %}" method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    <div class="col-sm-12 col-md-4">
      <br>
        <div class="input-group">
          <span class="input-group-addon">Year &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; </span>
          {% load widget_tweaks %}
          {{ modForm.year|add_class:"form-control" }}
        </div>
    </div>
    <div class="col-sm-12 col-md-4">
      <br>
        <div class="input-group">
          <span class="input-group-addon">Semester </span>
          {% load widget_tweaks %}
          {{ modForm.semester|add_class:"form-control" }}
        </div>
    </div>
    <div class="col-sm-12 col-md-4">
      <br>
        <div class="input-group">
          <span class="input-group-addon">Exam Type</span>
          {% load widget_tweaks %}
          {{ modForm.examtype|add_class:"form-control" }}
        </div>
    </div>
    <div class="col-sm-12 col-md-4">
      <br>
        <div class="input-group">
          <span class="input-group-addon">Exam Year</span>
          {% load widget_tweaks %}
          {{ modForm.examyear|add_class:"form-control" }}
        </div>
    </div>
    <div class="col-sm-12 col-md-4">
      <br>
        <div class="input-group">
          <span class="input-group-addon">Name and Address</span>
          {% load widget_tweaks %}
          {{ modForm.NamAdd|add_class:"form-control" }}
        </div> 
    </div>
    <div class="col-sm-12 col-md-4">
      <br>
        <div class="input-group">
          <span class="input-group-addon">Position &nbsp; &nbsp; &nbsp; </span>
          {% load widget_tweaks %}
          {{ modForm.position|add_class:"form-control" }}
        </div>
    </div>

    <div class="col-sm-12 col-md-12"> 
        <br>
        <center>
        <button type="submit" class="btn btn-success btn-lg"><spam class="glyphicon glyphicon-send"> </spam>&nbsp;&nbsp;&nbsp;Submit</button>
        </center>
    </div>
</form>

Файл My View.py:

def modIni(request):
    modForm     = modaForm(request.POST or None,request.FILES or None)
    year        = modForm['year'].value()
    semester    = modForm['semester'].value()
    examtype    = modForm['examtype'].value()
    examyear    = modForm['examyear'].value()
    NamAdd      = modForm['NamAdd'].value()
    position    = modForm['position'].value()

    fMod        = Moderation.objects.all().last
    if modForm.is_valid():
        instance = modForm.save(commit=False)
        flag    =True
        for obj in Moderation.objects.all():
            if obj.year == year and obj.semester == semester and obj.examtype == examtype and obj.examyear == examyear and obj.NamAdd == NamAdd and obj.position == position:
                context = {'fMod':fMod,'modForm':modForm,'msg':"<span style='color:red;'><h3>Already Inserted!</h3> Last entry : </span>"}      
                flag    = False
                break
        if flag:
            instance.save()
            #modForm = modaForm()
            context = {'NamAdd':NamAdd,'fMod':fMod,'modForm':modForm,'msg':"<span style='color:#4BB543;'><h3>successfully accomplished!</h3> Last entry : </span>"}
    else:
        context = {'fMod':fMod,'modForm':modForm,'msg':"<span style='color:Red;'> <center>Please fill in all the fields</center>Last entry : </span>"}
    return render(request, 'tbs/form/modaration.html',context)

Как сравнить obj.NamAdd.Name == NamAdd в представлении File? Пожалуйста, помогите мне, предоставив любую подсказку.

По сути, я хочу сохранить уникальный объект модерации в базе данных. Как это сделать? Есть ли альтернативный способ?

Спасибо заранее.

1 Ответ

0 голосов
/ 15 сентября 2018

Что не так с obj.NamAdd == NamAdd?
Многие.

Основной проблемой для ошибки сравнения является то, что NamAdd является целым числом (Teacher идентификатор объекта), где obj.NamAdd является объектом модели.
Итак, в связи с этим должно быть obj.NamAdd.id == NamAdd

Не делайте этого, пожалуйста. Не так. Вы обходите проверку ввода.

Это может быть obj.NamAdd == modForm.cleaned_data['NamAdd']

Так как вы хотите уникальный Moderation, добавить это к модели:

    class Meta:
    unique_together = (('year', 'semester', 'examtype', 'examyear', 'NamAdd', 'position'))

так что теперь это выглядит как

class Moderation(models.Model):
year = models.CharField(max_length=100, choices=[])
semester = models.CharField(max_length=100, choices=[])
examtype = models.CharField(max_length=30, choices=[])
examyear = models.CharField(max_length=30, choices=[])
NamAdd = models.ForeignKey(Teacher, on_delete=models.CASCADE)
position = models.CharField(max_length=100, choices=[])

def __str__(self):
    return unicode(self.NamAdd)

class Meta:
    unique_together = (('year', 'semester', 'examtype', 'examyear', 'NamAdd', 'position'))

(помните makemigrations и migrate )
** обратите внимание, я использовал пустой список для choices, отрегулируйте для вашего случая.

теперь в представлении, используйте это для проверки существования модерации:

moderation_exists = Moderation.objects.filter(year=modForm.cleaned_data['year'], semester=modForm.cleaned_data['semester'],examtype=modForm.cleaned_data['examtype'], examyear=modForm.cleaned_data['examyear'], NamAdd=modForm.cleaned_data['NamAdd'], position=modForm.cleaned_data['position']).exists()


    if moderation_exists:
        context = {'fMod': fMod, 'modForm': modForm,
                   'msg': "<span style='color:red;'><h3>Already Inserted!</h3> Last entry : </span>"}
        flag = False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...