繁体   English   中英

Django Inline Formset-可以向后跟随外键关系吗?

[英]Django Inline Formset - possible to follow foreign key relationship backwards?

我是django的新手,所以如果这个答案很明显,我深表歉意。

假设您有以下三种模型:

models.py

class Customer(models.Model):
    name = models.CharField()
    slug = models.SlugField()

class Product(models.Model):
    plu = models.Charfield()
    description = models.Charfield()

class Template(models.Model):
    customer = models.ForeignKey(Customer)
    product = models.ForeignKey(Product)
    price = models.DecimalField()

内联表单集如下所示:

TemplateFormSet = inlineformset_factory(Customer, Template, extra=0, 
                fk_name='customer', fields=('price'))

是否可以向后跟随“模板”表单集的“产品”外键,以便可以在同一表中显示plu和description字段?

例如这样的事情:

<table>
  <tbody>
  {% for obj in customer.template_set.all %}
    <tr>
      <td>{{ obj.product.plu }}</td>
      <td>{{ obj.product.description }}</td>
      <td>{% render_field formset.form.price class="form-control form-control-sm" %}</td>
    </tr>
  {% endfor %}
  </tbody>
</table>

表单集的字段与上面的html一起显示,但是绑定表单实例中的数据没有出现,并且我无法通过编辑空字段进行保存。

我也在下面尝试过,但是每个对象都重复了每个表单集(对于x个表单集,有x * x行):

<tbody>
{% for obj in customer.template_set.all %}
  {% for form in formset %}
    <tr>
      <td>{{ obj.product.plu }}</td>
      <td>{{ obj.product.description }}</td>
      <td>{% render_field form.price class="form-control" %}</td>
    </tr>
  {% endfor %}
{% endfor %}
</tbody>

基本上我想从图像的顶部到底部

表单集功能仅用于显示表单,但是您可以做的是创建一个自定义表单,该表单显示具有readonly功能的2个字段,例如:

class your_form(models.ModelForm):
     class Meta()
        model = Template
        fields = ['price', 'product']

     def __init__(self, *args, **kwargs):
         super(ItemForm, self).__init__(*args, **kwargs)
         self.fields['product'].widget.attrs['readonly'] = True

TemplateFormSet = inlineformset_factory(Customer, Template, extra=0, 
                fk_name='customer', form=your_form)

这是我的最佳尝试,如果您想同时显示两者,请尝试在模型中返回以下内容:

class Product(models.Model):
    plu = models.Charfield()
    description = models.Charfield()

    def __str__(self, *args, **kwargs):
        a = '<td>' + self.plu + '</td><td>' + self.plu '</td>' 
        return self.plu + self.description # Or return 'a'

尽管我不确定它是否是最有效的方法,但我设法使其正常运行。 如果有人有更好的方法,请告诉我。

{{ formset.management_form }}
<table>
  <thead>
  ...
  </thead>
  <body>
  {% for obj in customer.template_set.all %}
    {% with forloop.counter as outer_counter %}
      {% for form in formset %}
        {% if forloop.revcounter == outer_counter %}
          {% for hidden in form.hidden_fields %} {{ hidden }} {% endfor %}
          <tr>
            <td>{{ obj.product.plu }}</td>
            <td>{{ obj.product.description }}</td>
            <td>{% render_field form.price class="form-control" %}</td>
          </tr>
        {% endif %}
      {% endfor %}
    {% endwith %}
  {% endfor %}
  </tbody>
</table>

还应该提及我正在使用django-widget-tweaks,这是{% render_field %}来源。

更新(正确方法):

{% for template in customer.template_set.all %}
  {% for form in formset %}
    {% if form.instance.id == template.pk %}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM