首页 > 解决方案 > 如何使用 ModelMultipleChoiceField 在模板中获取用户的全名

问题描述

我有一个看起来像这样的表格:

class ProjectForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(ProjectForm, self).__init__(*args, **kwargs)
    members = forms.ModelMultipleChoiceField(
        label="Members",
        queryset=User.objects.all(),
        widget=forms.CheckboxSelectMultiple,
        required=False,
    )

    class Meta:
        model = Project
        fields = ['title', 'description', 'objective', 'duration', 'members']

这是我模板的一部分

    {% for pk, member in project_form.members.field.widget.choices %}
    <tr>
      <td>

        <div class="custom-control custom-checkbox">
          <input type="checkbox" class="custom-control-input" id="id_members_{{forloop.counter0}}" value="{{pk}}">
          <label class="custom-control-label" for="id_members_{{forloop.counter0}}">{{member.first_name}}</label>
        </div>
      </td>
    </tr>
    {% endfor %}

我想获取每个用户的全名而不是用户名,我该怎么做。

编辑

我的模型:

class User(AbstractUser):
    bio = models.TextField(max_length=500, blank=True)
    avatar = models.ImageField(upload_to=upload_to, default='avatars/user.png')

    def get_full_name(self):
        return self.first_name + ' ' + self.last_name

标签: djangodjango-formsdjango-templates

解决方案


所以,现在我想我明白了。您想手动呈现表单,以便全名显示为复选框的标签。为此,您必须访问成员的查询集属性。

这是它的样子,

 <form action="" method="post">
     {% for name, field in project_form.fields.items %}
         {% ifequal name 'members' %}

            <div>
                 <label>{{ field.label }}: </label>
                 <ul>
                 {% for member in field.queryset %}
                     <li>
                         <label for="id_members_{{ forloop.counter0 }}">
                             <input type="checkbox" name="{{ name }}" >
                             {{ member.get_full_name }}
                         </label>
                     </li>
                 {% endfor %}
                 </ul>
            </div>

         {% else %}
             <div>
                <label for="id_{{ name }}">{{field.label}}: </label>
                <input id="id_{{ name }}" type="{{ field.type }}">
             </div>
         {% endifequal %}
     {% endfor %}
 </form>

推荐阅读