首页 > 解决方案 > 如何遍历下拉模型表单字段以仅显示 Django 中的某些值

问题描述

我有4个选择

target = (('Week', 'Weekly target'),
          ('Day', 'Daily target'),
          ('Verify', 'Verify'),
          ('Done', 'Done'))

这是我实现选择的模型:

class GoalStatus(models.Model):

    target = models.CharField(max_length=100, choices=target, default="Week")
    name = models.ForeignKey(ScrummyUser, on_delete=models.CASCADE)
    goal_status = models.ForeignKey(ScrummyGoals, on_delete=models.CASCADE)

这是我的模型表格

class ChangeTaskForm(forms.ModelForm):

    class Meta:
        model = GoalStatus
        fields = '__all__'

这是我的 html 文件

{% if user.is_authenticated %}
{% if request.user|has_group:"ADMIN" %}

    <form action="{% url 'myapp:move_goal' %}"  method="post">
        {% csrf_token %}
        {% for field in form.data.target %}
            {% for foo in field %}
                {% if foo == Day %}
                    {{ foo }}
                {% endif %}
            {% endfor %}

        {% endfor %}
    </form>

我如何遍历表单中的下拉列表以仅显示所需的选择,例如为有权选择“日”的用户说“日”。我对 Django 很陌生。

标签: pythondjangopython-3.xdjango-formsdjango-templates

解决方案


your views在将表单发送到模板之前,所有逻辑都可以在后端 ( ) 中完成:

if request.user.groups.filter(name__iexact="ADMIN").exists():
    form.fields['target'].choices = ( ('Day', 'Daily target'))

由于您使用的是 Django CBV,请覆盖get_form()方法

def get_form(self, *args, **kwargs):
    form = super(ClassBasedView, self).get_form(*args, **kwargs)
    if self.request.user.groups.filter(name__iexact="ADMIN").exists():
        form.fields['target'].choices = ( ('Day', 'Daily target'))
    return form

推荐阅读