【问题标题】:Pre-populating a child models django create form with a parent's ID使用父 ID 预填充子模型 django create form
【发布时间】:2017-07-14 12:58:27
【问题描述】:

我已遵循此 answer 中的指南,以便将父 pk 传递到子创建页面。目前虽然它不起作用,但我看到了以下日志。

[14/Jul/2017 13:15:37] "POST /catalog/productstatus/2/create/ HTTP/1.1" 200 4001

我不确定我做错了什么,这是我目前拥有的代码。

模型

Models.py

class Product(models.Model):
    serial_number = models.CharField(unique=True, max_length=15)

class ProductStatus(models.Model):
    serial_number = models.ForeignKey('Product', on_delete=models.CASCADE, null=True)
    status = models.CharField(max_length=20,  blank=True, default='Stock', help_text='Products status')
    date = models.DateTimeField(auto_now_add=True)

查看

class ProductStatusCreate(CreateView):
    model = ProductStatus
    template_name = 'catalog/productstatus_create.html'
    form_class = ProductStatusModelForm

    def form_valid(self, form):
        productstatus = form.save(commit=False)
        product_id = form.data['product_id']
        product = get_object_or_404(Product, id=product_id)
        productstatus.product = product 
        return super(ProductStatusCreate, self).form_valid(form)

    def get_context_data(self, **kwargs):
        context = super(ProductStatusCreate, self).get_context_data(**kwargs)
        context['s_id'] = self.kwargs['product_id']
        return context

    def get_success_url(self):
        if 'product_id' in self.kwargs:
            product = self.kwargs['product_id']
        else:
            product = self.object.product.pk
        return reverse_lazy('product_detail', kwargs={'pk': product})

表格

class ProductStatusModelForm(forms.ModelForm):

    class Meta:
        model = ProductStatus
        fields = ['status',]

    def __init__(self, *args, **kwargs):
        self.fields["product"] = forms.CharField(widget=forms.HiddenInput())
        super(ProductStatusModelForm, self).__init__( *args, **kwargs)

templates/myapp/product_detail.html

<a href="{% url 'productstatus_create' product_id=product.id %}">New</a>

urls.py

urlpatterns += [  
url(r'^productstatus/(?P<product_id>\d+)/create/$', views.ProductStatusCreate.as_view(), name='productstatus_create'),
]

productstatus_create.html

{% extends "base_generic.html" %}
{% block content %}


<h2>New Product Status</h2>
</br>
<form action="" method="post">

  {% csrf_token %}
  <table>
  <input type=hidden id="id_product" name="product" value="{{ s_id }}">
  {{ form }}
  </table>
  <input type="submit" value="Submit" />
</form>
</br>

{% endblock %} 

当查看页面的源代码时,值会被填充,但是当我提交表单时,什么也没有发生。

【问题讨论】:

    标签: python django python-3.x django-forms


    【解决方案1】:

    为什么您的 urls.py 中有 views.ProductInstanceCreate.as_view() 但您显示的视图称为 ProductStatusCreate?您确定您使用的是正确的视图吗?

    【讨论】:

    • 抱歉,这些是我转录问题时的拼写错误,我现在已经更新了它,所以现在应该都是正确的。
    【解决方案2】:

    您正在表单中创建一个“产品”隐藏字段,但没有在任何地方为其提供值。然后,您的模板输出有两个产品字段,并采用后者(空白),因此返回一个错误,说明它是必需的。

    没有必要将产品 ID 输出到模板以将其读回 - 您始终可以在 URL kwargs 中获得可用的 ID。

    您可以摆脱您的get_context_data,以及表单和模板中的额外字段代码。您的 form_valid 可以是:

    def form_valid(self, form):
        product = get_object_or_404(Product, id=self.kwargs['product_id'])
        form.instance.product = product
        return super().form_valid(form)
    

    并且 product_id 将始终在 self.kwargs 中,因此您的 get_success_url 也可以更短:

    def get_success_url(self):
        product = self.kwargs['product_id']
        return reverse('product_detail', kwargs={'pk': product})
    

    【讨论】:

      猜你喜欢
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      • 2010-10-26
      • 2017-06-02
      • 1970-01-01
      • 2012-12-23
      • 2022-01-24
      相关资源
      最近更新 更多