簡體   English   中英

如何在Django表單中實現下拉列表?

[英]How can I implement a dropdown list in my Django form?

我正在嘗試在Django中實現一個下拉列表,其中包含域與當前登錄用戶的域匹配的那些用戶的電子郵件地址。

我正在使用以下代碼,但它仍顯示一個列表,而不是下拉列表。 我嘗試將小部件部分從ChoiceField更改為MultipleChoiceField,現在更改為CheckboxSelectMultiple,只是為了查看是否顯示了復選框,但似乎都不起作用。

這是我的forms.py

class AssignTask(forms.Form):
    title = forms.CharField(max_length=200)
    description = forms.CharField(widget=forms.Textarea)
    assign_to = forms.MultipleChoiceField(choices=[], widget=forms.CheckboxSelectMultiple, required=False)

    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user')
        user_email = self.user.email.split('@')[1]
        super(AssignTask, self).__init__(*args, **kwargs)
        self.fields['assign_to'] = forms.MultipleChoiceField(choices=[(i.email, i.email) for i in User.objects.filter(is_active=True, email__icontains=user_email)])

這是我的views.py

@login_required
def assigntask(request):
    assign_form = AssignTask(user=request.user)
    return render(request, 'todoapp/assign_task.html', context={'assign': assign_form})

這是我的html

{% extends 'todoapp/base.html' %}

{% block title %}Create a task{% endblock %}

{% block content %}
    <h2>Create a task and assign it to a user</h2>
    <form method="post">
        {% csrf_token %}
        {{ assign.as_p }}
        <br/><input type="submit" value="Assign">
        &nbsp;&nbsp;<button onclick="location.href='{%url 'dashboard' %}'" type="button">Go back</button>
    </form>
{% endblock %}

顯然,此解決方案對我有用

class AssignTask(forms.Form):
    title = forms.CharField(max_length=200)
    description = forms.CharField(widget=forms.Textarea)
    assign_to = forms.ChoiceField(widget=forms.Select(choices=[]))

    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user')
        user_email = self.user.email.split('@')[1]
        super(AssignTask, self).__init__(*args, **kwargs)
        self.fields['assign_to'] = forms.ChoiceField(choices=[(i.email, i.email) for i in User.objects.filter(is_active=True, email__icontains=user_email)])

如果我理解正確,那么此代碼可以解決嗎?

forms.py

class AssignTask(forms.Form):
    title = forms.CharField(max_length=200)
    description = forms.CharField(widget=forms.Textarea)
    # assign_to = forms.MultipleChoiceField(choices=[], widget=forms.CheckboxSelectMultiple, required=False)

    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user')
        user_email = self.user.email.split('@')[1]
        super(AssignTask, self).__init__(*args, **kwargs)
        # self.fields['assign_to'] = forms.MultipleChoiceField(choices=[(i.email, i.email) for i in User.objects.filter(is_active=True, email__icontains=user_email)])
        self.fields['assign_to'] = forms.ChoiceField(choices=[(i.email, i.email) for i in User.objects.filter(is_active=True, email__icontains=user_email)])

您可以看到一個下拉框嗎? 這是你的意思嗎?

我想您可能忘記了__init__函數內部的更改。


↓新增-----

重要的是__init__內部。 您首先聲明的“ assign_to”將在__init__部分中被覆蓋。 例如,假設您將“ assign_to”聲明為URLField,則ChoiceField將覆蓋它。 我正在解釋的是下面

forms.py

class AssignTask(forms.Form):
    title = forms.CharField(max_length=200)
    description = forms.CharField(widget=forms.Textarea)
    assign_to = forms.URLField()

    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user')
        user_email = self.user.email.split('@')[1]
        super(AssignTask, self).__init__(*args, **kwargs)
        print(self.fields)
        self.fields['assign_to'] = forms.ChoiceField(choices=[(i.email, i.email) for i in User.objects.filter(is_active=True, email__icontains=user_email)])
        print(self.fields)

產量

OrderedDict([('title', <django.forms.fields.CharField object at 0x0000000004D90C88>), ('description', <django.forms.fields.CharField object at 0x0000000004D90CC0>), ('assign_to', <django.forms.fields.URLField object at 0x0000000004D90668>)])
OrderedDict([('title', <django.forms.fields.CharField object at 0x0000000004D90C88>), ('description', <django.forms.fields.CharField object at 0x0000000004D90CC0>), ('assign_to', <django.forms.fields.ChoiceField object at 0x0000000004D906A0>)])

並且仍然顯示一個下拉框,不是嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM