Python Django内联表单集-是否可以向后跟踪外键关系?

Python Django内联表单集-是否可以向后跟踪外键关系?,python,django,python-3.x,Python,Django,Python 3.x,我对django很陌生,所以如果这有一个明显的答案,我很抱歉 假设您有以下三种型号: models.py class Customer(models.Model): name = models.CharField() slug = models.SlugField() class Product(models.Model): plu = models.Charfield() description = models.Charfield() class Tem

我对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'))
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'
是否可以向后跟随模板表单集的产品外键,以便在同一个表中显示plu和描述字段

例如,类似这样的事情:

<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>

{customer.template_set.all%}
{{obj.product.plu}}
{{obj.product.description}}
{%render_字段formset.form.price class=“表单控制表单控制sm”%}
{%endfor%}
表单集的字段与上面的html一起出现,但是绑定表单实例中的数据没有出现,我无法通过编辑空字段来保存

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


{customer.template_set.all%}
{formset%中表单的%s}
{{obj.product.plu}}
{{obj.product.description}}
{%render_字段form.price class=“form control”%}
{%endfor%}
{%endfor%}

表单集功能仅用于显示表单,但您可以创建一个自定义表单,该表单使用
只读功能显示两个字段,如:

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)
这是我的最佳尝试,如果您想同时显示这两个,请尝试在您的模型中返回以下内容:

TemplateFormSet = inlineformset_factory(Customer, Template, extra=0, 
                fk_name='customer', fields=('price'))
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'
类产品(models.Model):
plu=models.Charfield()
description=models.Charfield()
定义(self,*args,**kwargs):
a=''+self.plu+''+self.plu''
返回self.plu+self.description#或返回'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>

谢谢你的回答,但是我想在表中添加一些字段,这样做会很困难。