预先感谢您阅读此内容。我无法绕过它,现在它已经变得非常令人沮丧。
我们有以下注册表:
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()
。
我们的流程是:
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
是动态的,在这种情况下。
有什么想法吗?
答案 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
一起使用,这将返回尚未保存到数据库的对象。然后,您可以在最终保存该对象之前对其进行更改。
这就是您的代码的样子:
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
方法中