python - 使用模板中的表单访问模型字段的属性

标签 python django

我们正在构建一个 Django 应用程序并有一个包含两个类的模型:

class Category_Specialization (models.Model):
  name = models.CharField(max_length=50)

class Specialization (models.Model):
  specialization_name = models.CharField (max_length=60)
  category = models.ForeignKey(Category_Specialization)

class User (models.Model):
[...]
  specialization = models.ManyToManyField (Specialization)

我们已经创建了一个表单来显示现场用户的复选框:

class SpecializationForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
  super(UserServiceForm, self).__init__(*args, **kwargs)
  self.helper = FormHelper()
  self.helper.form_class = 'form-horizontal'
  self.helper.render_hidden_fields = True
  self.helper.form_tag = False
  self.helper.label_class = 'col-lg-2'
  self.helper.field_class = 'col-lg-10'

  self.helper.layout = Layout(
    'specialization',
    FormActions(
      Submit('submit', 'Create profile'),
    )
  )
  class Meta:
    model = User
    fields = ['specialization']
    widgets = {
    'specialization' : forms.CheckboxSelectMultiple,
    }

我们定义了 4 个类别,以及 2 个类别的特化。现在我们要在模板中显示所有类别,并在其中显示它们的特化。

因此,在我们的观点中:

list_categories = Category_Specialization.objects.order_by('name')
forms = UserSpecializationForm(request.POST or None, instance=request.user)

return render (request, 'users/profile/specialization.html', {
  'list_categories' : list_categories,
  'forms' : forms,
})

在我们的模板中,我们尝试做:

<form action="{% url 'users:specialization'  %}" method="post">
{% csrf_token %}

{% for category in list_categories %}
  <fieldset>
  <legend>{{category.name}}</legend>
  {% for form in forms %}
    {% for form_field in form %}
      {% if form_field.field.category.name == category.name %}
       {% load crispy_forms_tags %}
       {{form_field}}
       {% crispy form %}
      {% endif %}
    {% endfor %}
  {% endfor %}
  </fieldset>
{% endfor %}

问题是我们的 IF 没有工作,因为我们没有正确访问类别名称

那么,我们如何才能在 for 循环中访问字段的类别名称以在正确的类别中显示表单?

谢谢。

最佳答案

对我来说,使用自定义小部件定义是一种更好的方法。

输入你的 form.py:

class SpecializationByCategory(forms.CheckboxSelectMultiple):
def render(self, name, value, attrs=None, choices=()):
    if value is None: value = []
    has_id = attrs and 'id' in attrs
    final_attrs = self.build_attrs(attrs, name=name)
    output = [u'<ul>']
    # Normalize to strings
    str_values = set([force_unicode(v) for v in value])
    categories = Category_Specialization.objects.all()
    #for supercategory in supercategories:
    for category in categories:
        output.append(u'<li>%s</li>'%(category.name))
        output.append(u'<ul>')
        del self.choices
        self.choices = []
        specializations = Specialization.objects.filter(category=category)
        print specializations
        for specialization in specializations:
            self.choices.append((specialization.id,specialization.specialization_name))
            for i, (option_value, option_label) in enumerate(chain(self.choices, choices)):
                if has_id:
                    final_attrs = dict(final_attrs, id='%s_%s' % (attrs['id'], i))
                    label_for = u' for="%s"' % final_attrs['id']
                else:
                    label_for = ''
                cb = forms.CheckboxInput(final_attrs, check_test=lambda value: value in str_values)
                option_value = force_unicode(option_value)
                rendered_cb = cb.render(name, option_value)
                option_label = conditional_escape(force_unicode(option_label))
                output.append(u'<li><label%s>%s %s</label></li>' % (label_for, rendered_cb, option_label))
        output.append(u'</ul>')
        output.append(u'</li>')
    output.append(u'</ul>')
    return mark_safe(u'\n'.join(output))

并且在 SpecializationForm 中,像这样使用小部件:

widgets = {
        'specialization' : SpecializationByCategory,
    }

希望对您有所帮助。

关于python - 使用模板中的表单访问模型字段的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24251932/

相关文章:

python - 如果在异常后不重置,ContextVar 会在异步逻辑中泄漏内存吗?

python - 如何从给定的一组单词中打印出最长和最短的单词?

python - "Error: '::hypot ' has not been declared"在 cmath 中尝试嵌入 Python

python - Spark 中使用 Lambda 进行列表转换

python - Ubuntu 和 Django,没有名为 'django' 的模块

python - 如何动态添加自定义管理器以在 Django 中建模

Django 测试 : Does --keepdb reset changes made during tests?

python - 找到不固定长度的数字的所有可能排列以达到给定的总和或乘积

django - 让 Django 触发返回给自身的请求的最简单方法是什么?

1000 名用户的 Django 管理员下拉菜单