首页 > 解决方案 > 如何在用作表单的序列化程序上循环模板

问题描述

我需要一个 CRUD 表并且不想写出字段名称(太多)。我想使用序列化程序在第一行中制作表格,并在下面的行中制作已经输入的数据。显示数据工作正常,即使有选择和 FK。问题是我无法遍历表单字段。

在“template1.html”中,我检查了“render_form”和序列化程序。好的,到目前为止。问题:在“template2.hmtl”中,我尝试将每个表单(呈现的 REST 序列化程序)循环并定位在一列中并出现错误。如何正确循环?

template1.html
...rest of table is omitted...

     <tr>
        <form method="POST">
              {% csrf_token %}

              <th>
                   {% render_form serializer template_pack='rest_framework/inline'%}
                        <input type="submit" value="Save">
              </th>

        </form>
     </tr>
template2.html
...rest of table is omitted...

     <tr>
        <form method="POST">
           {% csrf_token %}
           {% for s in serializer %}         
              <th>
                   {% render_form s template_pack='rest_framework/inline'%}

              </th>
           {% endfor %}
              <th>
                  <input type="submit" value="Save">
              </th>
        </form>
     </tr>

错误:我得到的是“......模板重新渲染期间出错......”,“异常值:
'CharField'对象没有属性'data'”。它接缝“序列化器”是不可迭代的。我还在模板中尝试了 {% for s in serializer.data %} 。

附加信息:

serializer.py

class MyChoiceField(serializers.ChoiceField):
    ''' for display of field labels not keys'''

    def to_representation(self, data):
        if data not in self.choices.keys():
            self.fail('invalid_choice', input=data)
        else:
            return self.choices[data]

class KernSerializer(serializers.HyperlinkedModelSerializer):
    url = serializers.CharField(source='get_absolute_url', read_only=True)
    # strassenorientierung = serializers.SerializerMethodField(style={'base_template': 'select.html'})
    strassenorientierung = MyChoiceField(choices=Kern.CHOICES_strassenorientierung)
    oberflachenzustand   = MyChoiceField(choices=Kern.CHOICES_oberflachenzustand)
    beregnung            = MyChoiceField(choices=Kern.CHOICES_beregnung)
    date_posted = serializers.DateTimeField(format=None, default_timezone=TIME_ZONE) #format=DATETIME_FORMAT)
    class Meta:
        # 'url',
        model = Kern
        fields = ['url', 'id','abstand_horiz', 'abstand_vert', 'abstand_fahrtricht', 'strassenorientierung', 'oberflachenzustand','beregnung','entnahme_datum', 'betondeckung', 'bohrkernbezeichnung', 'karbonatisierung', 'wennersonde', 'comment','date_posted']
        depth = 1


view.py:

...stuff deleted ...
    serializer = KernSerializer()
     content = {'serializer': serializer, 'objekt_form': objekt_form, 'objektebelow': objektebelow_DRF.data, 'form': form, 'fields_list_displayed': fields_list_displayed, 'form_fields':form_fields,'model':model, 'next_url':next_url, 'projekt': projekt, 'objekt_data': objekt_data, 'projekt_id':projekt_id, 'objekt_id': objekt_id, 'bauteil': bauteil}
     return render(request, template_name, content)

标签: djangoformsrestserialization

解决方案


推荐阅读