[英]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">
<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.