Django ModelForm隐藏表单中的字段并使用url中的值

时间:2018-09-01 18:57:08

标签: django django-models django-forms

预先感谢您阅读此内容。我无法绕过它,现在它已经变得非常令人沮丧。

我们有以下注册表:

class RegistrationForm(forms.ModelForm):
    class Meta:
        model = Register
        fields = ('name', 'company_name')

    def clean(self):
        if is not self.cleaned_data.get('card').is_available():
            raise forms.ValidationError(_('Error'))

Register模型包括链接到card模型的Card。其中包括在功能上有效的is_available()

我们的流程是:

  • 最终用户选择列出所有注册信息的卡。
  • 他们点击“添加注册”按钮,将其带到卡片/ {PK} /添加。

Add registration按钮是generic.View。在post(self, request, pk)中,我有以下代码:

form = RegistrationForm(request.POST)

但是如何将Card.objects.get(pk=pk)的内容传递给它?

我尝试过:

data = request.POST.copy()
data['card'] = pk
form = RegistrationForm(data)

但是我认为由于card中不包含fields,因此它丢失了某个地方,从sanitize-all-input的角度来看这很有意义,但是我非常想补充一下card是动态的,在这种情况下。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

因此,只需使用CreateView并使用链接的网站研究其功能。

没有必要使用generic.View,因为它是基础知识的基础。您只想使用generic.View来实现所有这些逻辑,以更加熟悉事物的工作方式或需要一些非常特殊的表单处理。

简称为:

from django.views import generic
from myapp.forms import RegistrationForm

class CardCreateView(generic.CreateView):
    form_class = RegistrationForm

答案 1 :(得分:0)

ModelForm具有save方法。解决此问题的正确方法是将其与commit=False一起使用,这将返回尚未保存到数据库的对象。然后,您可以在最终保存该对象之前对其进行更改。

这是here in the docs

的解释

这就是您的代码的样子:

form = RegistrationForm(request.POST)
form.save(commit=False)
form.card = Card.objects.get(pk=pk)
form.save_m2m()
如果您的模型与其他模型具有多对多关系,则应使用

save_m2m。就我而言,它是一个OneToOne,所以我改用save()

如果您使用CreateView而不是通用的View,则上面的代码段应进入覆盖的form_valid方法中