【问题标题】:Django: Accessing queryset in ModelMultipleChoiceField from templateDjango:从模板访问 ModelMultipleChoiceField 中的查询集
【发布时间】:2021-02-07 16:35:40
【问题描述】:

我正在创建一个面板,用户可以在其中将分配分配给其他用户。我正在尝试使用 ModelMultipleChoiceField 和一个名为 AssignedUsersForm 的表单来构建它

forms.py

class AssignedUsersForm(ModelForm):
    class Meta:
        model = Assignment
        fields = ['users']

    custom_users = CustomUser.objects.all()
    users = forms.ModelMultipleChoiceField(queryset=custom_users, widget=forms.CheckboxSelectMultiple())

模板

  <form method="post" id="assigned_users_form">
      {% csrf_token %}
      {{ assigned_users_form.errors }}
      {{ assigned_users_form.non_field_errors }}
      <div class="fieldWrapper">
          {{ assigned_users_form.content.errors }}
          {% for user in assigned_users_form.users %}
          <div class="myradio">
              {{ user }}
          </div>
          {% endfor %}
      <br>
      <div style="text-align:center;">
        <input class="input-btn" type="submit" value="Save" name='submit_assigned_users_form'>
      </div>
  </form>

我已经成功地在我的 HTML 中分别呈现了 CheckboxSelectMultiple 的每个选项。

不幸的是,'user' 的每次迭代都会呈现 CustomUser 对象 (#) - 对象的默认名称。

据我了解,Checkbox 小部件不会将原始查询集传递给模板。因此,我无法访问每个用户的模型属性并呈现姓名、头像等信息。

是否有一种方法可以访问清单中表示的实际对象,而不是 _ str _ 值?

我考虑过在模板中运行查询集的并行迭代,但我不确定这在 Django 中是否可行。

我也考虑过创建自定义模板标签以根据 str 中的 id 访问每个对象,但这似乎有点过头了?

有没有我在这里遗漏的更直观的方法?

【问题讨论】:

  • Choices 应该是 (redable_value, exact_value) 格式的元组,所以问题是,你想设置什么为 (redable_value, exact_value) b>可读值?
  • 我想 readable_value 是对象,但我不知道如何编码?
  • 应该不是对象,而是对象的PK值
  • 是的,我知道 pk 存储在元组中。您知道从模板访问该 id 的语法吗?我收到一个错误,提示无法迭代绑定的对象

标签: django


【解决方案1】:

我通过创建一个接受复选框值并将相应对象返回给模板的 template_filter 找到了解决方法。

template_tags.py

@register.filter(name='get_user')
def get_user(user_id):
    user = CustomUser.objects.get(pk=user_id.value)
    return user

模板

 <form method="post" id="assigned_users_form">
      {% csrf_token %}
      {{ assigned_users_form.errors }}
      {{ assigned_users_form.non_field_errors }}
      <div class="fieldWrapper">
          {{ assigned_users_form.content.errors }}
          {% for user in assigned_users_form.users %}
          <div class="myradio">
              {% with customuser=user.data.value|get_user %}
              {{user.tag}} {{customuser.first_name }}
              {% endwith %}
          </div>
          {% endfor %}
      <br>
      <div style="text-align:center;">
        <input class="input-btn" type="submit" value="Save" name='submit_assigned_users_form'>
      </div>
  </form>

本质上,此代码查看复选框小部件迭代(用户)并获取值,将该值传递给模板标签,然后将关联的对象返回给页面。

不是最好的解决方案,因为您要对每个对象重复查询搜索,而不是一次将它们全部收集起来。但这是我能想到的最好的了。

【讨论】:

    猜你喜欢
    • 2012-12-28
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多