我正在使用基于类的表单和视图。用户从“选择公司表单”中选择一家公司'然后在“为公司表单创建联系人”中添加联系人给公司。鉴于公司已知,公司选择列表不应出现在公司表格的“创建联系人”中。因为它很长,而且用户不应该在公司表单的“创建联系人”中更改公司。
问题1:为了避免显示公司列表,我将公司小部件设置为forms.py中的隐藏。但是,我知道如何将隐藏字段的初始值设置为url参数。 问题2:此方法存在明显的缺点,因为用户可以更改网址中的companyid或表单中的隐藏值。有更好的方法吗?Urls.py
url(r'^company/contact/create/(?P<companyid>\d*)/$', contact_create.as_view(), name='contact-create')
Models.py
class Company(models.Model):
name = models.CharField(max_length=50)
def __unicode__(self):
return u'%s' % (self.name)
class Contact(models.Model):
name = models.CharField(max_length=50)
company = models.ForeignKey(Company)
def __unicode__(self):
return u'%s' % (self.name)
forms.py
class ContactForm(ModelForm):
class Meta:
model = Contact
widgets = {
'company' : HiddenInput(attrs={ 'initial': <GET URL PARAM COMPANYID>})
}
view.py
class contact_create(CreateView):
model = Contact
form_class = ContactForm
答案 0 :(得分:0)
表单元类在导入时进行评估,因此自然无法访问初始数据。如果您想设置它,可以通过覆盖get_initial
方法在视图中执行此操作。
(注意窗口小部件没有初始属性的方式,因为initial是字段的属性,而不是窗口小部件。)
然而,正如你所说,这不是一个好办法,因为隐藏输入的值可以改变。您希望显式设置此值 - 再次在视图中执行此操作,这次是在form_valid
方法中。
它看起来像这样:
class ContactCreate(CreateView):
model = Contact
form_class = ContactForm
def form_valid(self, form):
contact = form.save(commit=False)
contact.company_id = self.kwargs['company']
contact.save()
self.object = contact
return HttpResponseRedirect(self.get_success_url())