我試圖從表單POST
得到的數據是,但在數據值的一個原因造成的錯誤:Django的數據後產生錯誤由於值列表中
ipdb> request.POST
<QueryDict: {'assign_to-autocomplete': [''], 'tasks': ['18'], 'csrfmiddlewaretoken': ['lVqkbkYdz42uTtLJviRIj3OukcwqsdvI'], 'assign_to': ['14'], 'action_type': ['assign_to']}>
表單數據:
ipdb> self.form.data
{'assign_to-autocomplete': [''], 'tasks': ['18'], 'csrfmiddlewaretoken': ['lVqkbkYdz42uTtLJviRIj3OukcwqsdvI'], 'assign_to': ['14'], 'action_type': ['assign_to']}
我使用autocomplete_light
爲assign_to
場,這是一個User
。
assign_to
是一個pks的列表,這似乎是造成問題。
views.py:
class TasksPreviewView(MyMixin, FormView):
''' An intermediate page '''
template_name = 'tasks/task_preview.html'
def post(self, request):
import ipdb; ipdb.set_trace()
self.action_type = request.POST['action_type']
form_class = self.get_form()
self.form = form_class(data=dict(request.POST))
if self.form.is_valid():
return self.form_valid(self.form)
else:
return self.form_invalid(self.form)
forms.py:
class TaskBulkAssignToForm(forms.ModelForm):
tasks = forms.ModelMultipleChoiceField(queryset=Task.objects.all(), label='')
assign_to = al.ModelChoiceField('UserStaffAutocomplete', queryset=User.objects.all(), required=True, label='Select a user')
def __init__(self, *args, **kwargs):
''' Filter down to the tasks of interest and set tasks as a hidden field '''
super().__init__(*args, **kwargs)
task_pks = (self.initial or self.data)['tasks']
self.fields['tasks'].queryset = self.fields['tasks'].queryset.filter(
pk__in=task_pks,
)
self.fields['tasks'].widget.attrs['class'] = 'hidden'
def post_valid(self):
''' Called by form_valid '''
# Do some processing
# Return a success message
def post_invalid(self):
''' Called by form_invalid '''
# Return an error message
class Meta:
model = Task
fields = ('tasks', 'assign_to')
由於這樣的結果,我的狀態始終是無效的,因爲它不希望一個列表: django.core.exceptions.ValidationError: ['Select a valid choice. That choice is not one of the available choices.']
相反的user_pk
,如'14'
,['14']
通過request.POST
。如果我手動將值調整爲'14'
而不是['14']
和continue
,則表單按預期工作得很漂亮。
對於某些情況下,TasksPreviewView
是一種中間頁面,類似於Django admin page。每個批量操作都有其自己的格式(在此例中爲assign_to
操作)。第一頁使用表單重定向到中間頁面,但保留GET中的所有對象。第二頁(確認頁)執行POST
。任何人都可以幫我解決這個問題嗎?