在基于类的表单中获取url参数

时间:2014-06-23 09:13:25

标签: django django-models django-forms

我正在使用基于类的表单和视图。用户从“选择公司表单”中选择一家公司'然后在“为公司表单创建联系人”中添加联系人给公司。鉴于公司已知,公司选择列表不应出现在公司表格的“创建联系人”中。因为它很长,而且用户不应该在公司表单的“创建联系人”中更改公司。

问题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

1 个答案:

答案 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())