首页 > 解决方案 > Django 3.1:使用 CreateView 预填充外键字段

问题描述

关于这个话题有很多答案。我读过的这些都没有帮助我找到出路。

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

现在,我想添加一个按钮:“添加电子邮件”,它会打开一个表单。因为我在联系人的详细视图中,所以我想将 id 交给表单,以便使用联系人 pk 预先或后填充电子邮件对象(fk to contact)。

从我的角度来看,最简单的方法是将 pk 添加到 url 并在“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)

url 模式:

 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错误。

标签: djangodjango-viewsforeign-keys

解决方案


    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)

推荐阅读