Django forms: объект не имеет атрибута очищенные данные
Я довольно новичок в Django. Я получаю эту ошибку, когда пытаюсь использовать form.clean_data. Везде, где я проверял в Интернете, говорится, что это происходит потому, что вы, возможно, не используете функцию is_valid, что я и делаю. Моя цель - создать набор записей, который хранит ID студента и ID предмета в качестве внешних ключей в модели под названием Sub_and_stu. Я открыт для любых других (таких же простых?) способов достижения этой цели.
views.py
@csrf_protect
def select_subs(request):
form1 = Sub_selection1(request.POST)
form2 = Sub_selection2(request.POST)
form3 = Sub_selection3(request.POST)
form4 = Sub_selection4(request.POST)
user = request.user
if form1.is_valid and form2.is_valid and form3.is_valid and form4.is_valid:
data1 = form1.cleaned_data
sub1=data1['subject_id']
Sub_and_stu.objects.create(student_id=user,subject_id=sub1)
data2 = form2.cleaned_data
sub2=data2['subject_id']
Sub_and_stu.objects.create(student_id=user,subject_id=sub2)
data3 = form3.cleaned_data
sub3=data3['subject_id']
Sub_and_stu.objects.create(student_id=user,subject_id=sub3)
data4 = form4.cleaned_data
sub4=data4['subject_id']
Sub_and_stu.objects.create(student_id=user,subject_id=sub4)
context={'form1':form1,'form2':form2,'form3':form3,'form4':form4}
return render(request,'select_subs.html',context)
models.py
class Subject(models.Model):
subject_id=AutoSlugField(unique=True)
name = models.CharField(max_length=50)
def __str__(self):
return self.name
class Sub_and_stu(models.Model):
record_id=AutoSlugField(unique=True)
student_id=models.ForeignKey(User,on_delete=models.CASCADE)
subject_id=models.ForeignKey(Subject,on_delete=models.CASCADE)
class Sub_and_teachers(models.Model):
record_id=AutoSlugField(unique=True)
teacher_id=models.ForeignKey(User,on_delete=models.CASCADE)
subject_id=models.ForeignKey(Subject,on_delete=models.CASCADE)
forms.py
class Sub_selection1(ModelForm):
class Meta:
model = Sub_and_stu
fields=['subject_id']
#Other subject selection forms are basically a copy of this. I need the user to pick multiple subejcts at the same time
snippet from select_subs.html
<form>
{%csrf_token%}
<h3>Subject 1</h3>
{% render_field form1.subject_id class='pure-input-1 pure-input-rounded' }
<h3>Subject 2</h3>
{% render_field form2.subject_id class='pure-input-1 pure-input-rounded' }
<h3>Subject 3</h3>
{% render_field form3.subject_id class='pure-input-1 pure-input-rounded' }
<h3>Subject 4</h3>
{% render_field form4.subject_id class='pure-input-1 pure-input-rounded' }
<button type="submit" class="pure-button pure-button-primary"
name='subjects'>Submit</button>
</form>
Вы должны вызывать is_valid() со скобками.
Сейчас вы просто проверяете, существует ли атрибут is_valid, существование которого означает, что метод равен True.
is_valid - это метод
is_valid() со скобками - это то, как вы вызываете метод, чтобы увидеть, действительна ли форма или нет. Когда вы вызываете метод, он генерирует cleaned_data для вас.
Подробнее о методе is_valid можно прочитать в документации https://docs.djangoproject.com/en/4.0/ref/forms/api/#django.forms.Form.is_valid