Django 如何使用modelmultipechoicefield获取模板中用户的全名

Django 如何使用modelmultipechoicefield获取模板中用户的全名,django,django-forms,django-templates,Django,Django Forms,Django Templates,我有一张这样的表格: class ProjectForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(ProjectForm, self).__init__(*args, **kwargs) members = forms.ModelMultipleChoiceField( label="Members", queryset=User

我有一张这样的表格:

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

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

下面是它的样子

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

{%代表名称,项目中的字段\ u form.fields.items%}
{%ifequal name'成员“%”
{{field.label}}:
    {field.queryset%中的成员的%s}
  • {{member.get_full_name}
  • {%endfor%}
{%else%} {{field.label}}: {%endifequal%} {%endfor%}
Models.py

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

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

检查它

您是否尝试过{{member.get_full_name}}?它不起作用,请尝试以下方法:{%for project_form.members%}{{member.get_full_name}{%endfor%}第一种或第二种方法对我都不起作用,请看我上面的编辑。你能确保Django admin中的用户有名字和姓氏吗?可能的情况是,first_name和last_name字段都为空。大多数用户都有first和last_name,因为您有一个自定义的
User
AbstractBaseUser
扩展而来,您必须在您的用户模型中包括first_name和last_name。在您的模板中,现在应该是
{member.get_full_name}

如果这不起作用,请尝试从Django shell访问用户,并确认您确实可以获取他们的名字和姓氏。
class User(AbstractUser):
    bio = models.TextField(max_length=500, blank=True)
    avatar = models.ImageField(upload_to=upload_to, default='avatars/user.png')

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