渲染和保存Django表单

时间:2016-07-10 21:50:35

标签: django django-models django-forms django-views

我正在尝试创建一个包含多个复选框的表单。但是,表单加载正常,但数据未保存。我可以通过在admin中输入数据而不是在表单中输入数据来保存数据。如果我在没有is_valid()的视图中保存表单,那么表单保存默认值而不是我在表单中输入的那些。复选框值也会引发错误:'antibiotics'不是主键的有效值,比如说,如果我选择抗生素。我是django的新手所以请原谅我做错了。

models.py:

class Taken24h(models.Model):
    CHOICES_EATEN = (
        ('antibiotics', 'Antibiotics'),
        ('steroids', 'Steroids'),
        ...
    )
    val = models.CharField(max_length=40,choices=CHOICES_EATEN,blank=True,null=True)


    class BloodDonation(models.Model):
        name = models.CharField(max_length=100,blank=False,null=True)
        date_of_birth = models.DateField(null=True,blank=False)
        nationality = models.CharField(max_length=50,blank=False,null=True)
        ... 
        taken_following_in_last_24_hrs = models.ManyToManyField(Taken24h,blank=True)

forms.py:

    class BloodDonationForm(forms.ModelForm):   
        name = forms.CharField(widget=forms.TextInput,required=True)
        date_of_birth = forms.CharField(widget=forms.DateInput,required=True)
        nationality = forms.CharField()
    ...


        taken_following_in_last_24_hrs = forms.ModelMultipleChoiceField(queryset=Taken24h.objects.all(),
widget=forms.CheckboxSelectMultiple,required=False)
    )

        class Meta:
            model = BloodDonation
            fields = '__all__'
        def __init__(self,*args,**kwargs):
            super(BloodDonationForm, self).__init__(*args, **kwargs)
            self.fields['taken_following_in_last_24_hrs'].choices = Taken24h.CHOICES_EATEN

views.py:

def forms(request):
    form = BloodDonationForm(request.POST or None)      
    if form.is_valid():
        form.save(commit=True)          
    else:
        print("Invalid")    
    data = {
    'form':form,
    }
    return render(request,"forms.html",data)

1 个答案:

答案 0 :(得分:0)

我不确定这个答案会有所帮助,但是从您编写的代码中,您忘记在处理views.py文件中的表单之前键入request.method

def forms(request):
    if request.method == 'POST':
        form = BloodDonationForm(request.POST or None)      
        if form.is_valid():
            form.save(commit=True)          
        else:
            print("Invalid")
    else:
        form = BloodDonationForm()

    data = {
        'form':form,
    }

    return render(request,"forms.html", data)