【问题标题】:Django: automatically assigning foreign key in CBV formDjango:以 CBV 形式自动分配外键
【发布时间】:2018-01-15 21:37:42
【问题描述】:

这建立在:Django automatically set foreign key in form (with class based views)。那里的答案似乎可行,但 Django 抛出 ValueError

我有 (2) 个模型:通过外键关联的产品和过程。我想从产品页面获得一个链接来添加程序,并让产品 FK(通过其 pk)自动传递到表单。有几千种产品,因此从下拉列表中手动选择 FK 是不可行的。

class ProductBase(models.Model):
    id = models.UUIDField(primary_key=True,default=uuid.uuid4,null=False)
    name = models.CharField(max_length=128,null=False)

class ProcedureText(models.Model):
    id_procedure = models.UUIDField(primary_key=True,default=uuid.uuid4,null=False)
    text_procedure = models.TextField()
    parent_product = models.ForeignKey(ProductBase,on_delete=models.CASCADE')

我有一个来自产品详细信息页面的链接来调用 CreateView:

<a class='btn btn-success' href="{% url 'products:addprocedure' pk=product_details.pk %}">Add Procedure</a>

通过urls.py映射:

    path('addprocedure <pk>',views.AddProcedureView.as_view(),name='addprocedure'),

class AddProcedureView(CreateView):
    form_class = AddProcedureForm
    template_name = 'addprocedure.html'
    model = ProcedureText
    #fields = ('__all__')

    def form_valid(self, form):
        form.instance.parent_recipe = self.kwargs.get('pk')
        return super(AddProcedureView, self).form_valid(form)

在 forms.py 中调用

class AddProcedureForm(forms.ModelForm):

    class Meta:
        model = ProcedureText
        fields = ('__all__')

并模板化为标准形式:

<form class="form-horizontal" action="" enctype="multipart/form-data" method="POST">
  {% csrf_token %}
  {{ form.as_p }}
  <button type="submit" class="btn btn-primary">Submit</button>
</form>

每当提交表单时,Django都会返回表单的ValueError:

无法分配“'28a3a242-06f6-464a-9b01-aa3fefa866ed'”:“ProcedureText.parent_product”必须是“ProductBase”实例。

即使被拒绝的 UUID 是传递给它的 UUID,并且它是一个实际的现有 ProductBase 实例。传递给它的任何实例 UUID 都会出现此问题。

有没有想过这里出了什么问题?

【问题讨论】:

    标签: django


    【解决方案1】:

    设置parent_recipe_id 而不是parent_recipe

    def form_valid(self, form):
        form.instance.parent_recipe_id = self.kwargs.get('pk')
    

    然后您应该修改fieldsexclude,使parent_recipe 不包含在表单中。

    【讨论】:

    • 太棒了!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2021-07-19
    • 2017-05-10
    • 2013-09-30
    • 2023-04-01
    • 2014-04-09
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多