我正在尝试在 django 1.9 中创建一个用于任务跟踪和排序的 webapp。不同的任务被划分为空间(如不同的项目)。现在,我希望能够在 CreateView 中选择任务分配给什么。
问题是,我的系统中有大量用户,所以我不想显示下拉菜单。相反,我想使用一个TextInput
小部件,让表单检查可用选项(这样我也可以在客户端使用预先输入)。
这是我能为 TaskCreate 视图想出的最好的方法:
class TaskCreate(LoginRequiredMixin, CreateView):
"""
a view for creating new tasks
"""
model = Task
fields = ['space', 'name', 'description', 'assigned_to', 'due_date']
template_name = "task_tracker/task_form.html"
success_url = reverse_lazy('tracker:my_open_task_list')
def get_context_data(self, **kwargs):
context = super(TaskCreate, self).get_context_data(**kwargs)
context['header_caption'] = 'Create'
context['submit_caption'] = 'Create'
context['all_usernames'] = [x.username for x in User.objects.all()]
return context
def get_form(self, form_class=None):
form = super(TaskCreate, self).get_form(form_class)
form.fields['assigned_to'].choices = [(x.username, x.id) for x in User.objects.all()]
form.fields['assigned_to'].initial = self.request.user.username,
form.fields['assigned_to'].widget = widgets.TextInput()
try:
form.fields['space'].initial = Space.objects.get(name=self.request.GET['space'])
finally:
return form
def form_valid(self, form):
form.instance.created_by = self.request.user
form.instance.assigned_to = User.objects.get(username=form.cleaned_data['assigned_to'])
return super(TaskCreate, self).form_valid(form)
但问题是这不起作用——即使我输入了有效的用户名,表单仍然认为我的选择是非法的。
我试图在选择字段中切换位置x.username
和x.id
,但这对我没有帮助。
我已经坚持了一个星期。有人可以帮我吗?