django 未提交带有隐藏字段的表单

wfauudbj  于 2023-11-20  发布在  Go
关注(0)|答案(1)|浏览(136)

我在django中有以下表单

forms.py

class CtForm(ModelForm):

    class Meta:
        model       = Contact
        fields      = ["name", "email"]
        # widgets     = {'cid': HiddenInput()}


models.py

class Contact(models.Model):
    cid             = models.ForeignKey(Cr, on_delete=models.CASCADE)
    name            = models.CharField(max_length=255, null=False)
    email           = models.EmailField(max_length=255, null=False)

字符串
我有一个模板中显示的形式,一切都显示良好,没有问题,问题是当我提交表单,我得到以下错误:

(Hidden field cid) This field is required.


但如果我把

widgets     = {'cid': HiddenInput()}


从forms.py它的作品完美,任何方法,使这一工作,而不显示在模板中的CID?

views.py

def create_contact(request, cid):

    cr = cr.objects.get(id=cid)
    
    if request.method == 'POST':

        form = CtForm(request.POST)

        if form.is_valid():
            form.instance.cid_id = cid

            form.save()
            
            return render(request, 'create_contact.html', {
                'form': form,
                'cr': cr,
            })
    else:

        form = CtForm(None)

        return render(request, 'create_contact.html', {
            'form': form,
            'cr': cr,
        })


正在使用的模板代码

<form method="post" action="" novalidate>
                        {% csrf_token %}

                        <tbody>
                            {{ form.as_table }}
                            <td><input type="submit" value="Create"> </td>
                        </tbody>
                    </form>

qij5mzcb

qij5mzcb1#

没有必要在表单中包含cid,它已经在URL中了。因此我们可以从表单中排除它:

class CtForm(ModelForm):
    class Meta:
        model = Contact
        fields = ['name', 'email']  # 🖘 no cid

字符串
在视图中,我们注入cid,所以:

from django.shortcuts import get_object_or_404, redirect

def create_contact(request, cid):
    cr = get_object_or_404(Cr, id=cid)
    if request.method == 'POST':
        form = CtForm(request.POST, request.FILES)
        if form.is_valid():
            form.instance.cid_id = cid
            form.save()
            return redirect('name-of-some-view')
    else:
        form = CtForm()
    return render(request, 'create_contact.html', {'form': form, 'cr': cr})

备注:通常使用**get_object_or_404(…)[Django-doc]比直接使用.get(…)[Django-doc]更好。如果对象不存在,例如因为用户自己更改了URL,get_object_or_404(…)将导致返回 HTTP 404 Not Found 响应,而使用.get(…)将导致 HTTP 500 Server Error
备注:虽然大多数表单都不处理媒体文件,但最好还是将
request.FILES[Django-doc]传递给表单,这样,如果您稍后添加额外的媒体字段,所有使用表单的视图都将正确处理文件。
备注:如果POST请求成功,你应该做一个
redirect**[Django-doc]来实现Post/Redirect/Get pattern [wiki]。这样可以避免当用户刷新浏览器时你做同样的POST请求。

相关问题