django - 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错误。
解决方案
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)
推荐阅读
- c# - Azure 函数 host.json 被忽略
- kdb - 没有匹配的行时更新列类型
- flutter - 将工作日中的列表项之一放置在特定日期的屏幕中央
- javascript - 当我调用 this.property 时,未定义 JS 类属性
- nginx - '[error] ...限制请求'这是一个错误,还是只是表明limit_req正在按要求工作?
- python - Python中的JSON到长表
- powershell - 使用常用词选择文件夹名称
- python - 如何解决此调用异常错误?
- reactjs - Electron + React,将文件保存到本地目录使 React 重新加载
- python - ImportError:无法从“skimage”导入名称“metrics”