Django 3.1:使用CreateView预先填充外键字段

时间:2020-08-09 16:17:26

标签: django django-views foreign-keys

有关此主题的答案很多。我读过的这些书都没有帮助我找到出路。

情况:我有一个联系模型,我希望分配一个电子邮件地址。它们位于带有外键的表中。

现在,我想添加一个按钮:“添加电子邮件”,这将打开一个表单。正如我在联系人的详细信息视图中一样,我想将ID移交给表单,以使用联系人pk预先或之后填充电子邮件对象(要联系的fk)。

从我的角度来看,最简单的方法是将pk添加到网址中,并在“ form_valid”中使用它。

视图:

class EmailCreateView(LoginRequiredMixin, CreateView):
model = EmailAddress
fields = ('scope', 'email',)  # 'contact',
template_name = 'contacts/contact_form.html'
# initial = {'email': 'test'}

def form_valid(self, form):
    form.instance.create_by = self.request.user.username
    form.instance.update_by = self.request.user.username
    # form.instance.contact = Contact.objects.get(self.kwargs['contact_pk']) <- not working
    return super().form_valid(form)

urlpattern:

 path('email/add/', EmailCreateView.as_view(), name='add_email'),

模型:

class EmailAddress(CommonInfo):
scope = models.CharField('Bereich', max_length=2, choices=SCOPE_TYPES)
contact = models.ForeignKey(Contact, verbose_name='Kontakt', on_delete=models.CASCADE)
email = models.EmailField('E-Mail')

def __str__(self):
    return '{}'.format(self.email)

def get_absolute_url(self):
    return reverse('contacts:detail', kwargs={'pk': self.contact_id})

我真的不知道我缺少什么。由于这是数据库开发中的标准案例,因此应该很容易。我几乎可以肯定,我已经忽略了一些简单的事情。但是每当我尝试传递url参数时,都会遇到 NoReverseMatch 错误。

1 个答案:

答案 0 :(得分:0)

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.create_by = self.request.user.username
        self.object.update_by = self.request.user.username
        self.object.save()
        return super().form_valid(form)