Django 如何让UpdateView使用通用FormView
我有一个Django 如何让UpdateView使用通用FormView,django,python-3.x,Django,Python 3.x,我有一个Formview和一个UpdateView,它们相互冲突。他们应该一起工作,但不是这样。每当我尝试使用UpdateView时,值都会通过FormView进行保存,这会导致它发回表单验证错误 e、 g.“具有此标题的视频已经存在” Forms.py: class BaseVideoUploadForm(forms.ModelForm): """ Form for uploading videos using related to: :model: 'videos.
Formview
和一个UpdateView
,它们相互冲突。他们应该一起工作,但不是这样。每当我尝试使用UpdateView
时,值都会通过FormView
进行保存,这会导致它发回表单验证错误
e、 g.“具有此标题的视频已经存在”
Forms.py:
class BaseVideoUploadForm(forms.ModelForm):
"""
Form for uploading videos using related to:
:model: 'videos.Video'.
"""
title = forms.CharField(
widget=forms.TextInput(
attrs={'placeholder': 'Blackjack shuffle procedures'}))
description = forms.CharField(
widget=forms.Textarea(attrs={'rows': 3}),
help_text='A description of the content in this video.')
category = forms.ModelChoiceField(
queryset=Category.objects.all(),
required=True)
receiver = forms.ModelMultipleChoiceField(
queryset=EmployeeType.objects.all(),
required=True,
widget=forms.CheckboxSelectMultiple,
help_text='Employees in these groups will be able to view the video.')
video_file = forms.FileField()
thumbnail = forms.ImageField(required=False)
class Meta:
model = Video
fields = (
'title',
'description',
'receiver',
'category',
'video_file',
'thumbnail',
)
widgets = {
'date_time': forms.HiddenInput(),
'sender': forms.HiddenInput(),
'unviewed': forms.HiddenInput(),
'viewed': forms.HiddenInput(),
}
def __init__(self, *args, **kwargs):
super(BaseVideoUploadForm, self).__init__(*args, **kwargs)
self.fields['receiver'].label = "Viewers"
self.fields['receiver'].queryset = EmployeeType.objects.all()
self.fields['category'].queryset = Category.objects.all()
class VideoUploadForm(BaseVideoUploadForm):
send_notifications = forms.BooleanField(
required=False,
help_text='Send viewers a notification about the new video.')
class Meta(BaseVideoUploadForm.Meta):
fields = BaseVideoUploadForm.Meta.fields + ('send_notifications', )
class VideoUpdateView(UpdateView):
model = Video
form_class = VideoUploadForm
表单视图:
class VideoUploadView(FormView):
form_class = VideoUploadForm
success_url = '/videos'
template_name = 'videos/video_form.html'
def get(self, request, *args, **kwargs):
form = self.form_class()
return render(request, self.template_name, {'form': form})
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST, request.FILES)
form.instance.sender = self.request.user
if form.is_valid():
form.save()
# doing stuff
form.save()
messages.success(self.request, self.success_message)
if request.is_ajax():
return JsonResponse({'success': True, 'url': reverse('videos-home')})
else:
return redirect(self.success_url)
else:
if request.is_ajax():
return JsonResponse({'success': False, 'error': form.errors})
else:
return render(request, self.template_name, {'form': form})
urlpatterns = [
path('', views.VideoListView.as_view(), name='videos-home'),
path('upload/', views.VideoUploadView.as_view(), name='videos-upload'),
path('<int:pk>', VideoDetailView.as_view(), name='videos-detail'),
path('<int:pk>/delete/', VideoDeleteView.as_view(), name='videos-delete'),
path('<int:pk>/viewed/', views.mark_as_viewed, name='mark-as-viewed'),
path('<int:pk>/update/', VideoUpdateView.as_view(), name='videos-update'),
path('<int:pk>/notify', VideoNotificationView.as_view(), name='videos-notify'),
]
更新视图:
class BaseVideoUploadForm(forms.ModelForm):
"""
Form for uploading videos using related to:
:model: 'videos.Video'.
"""
title = forms.CharField(
widget=forms.TextInput(
attrs={'placeholder': 'Blackjack shuffle procedures'}))
description = forms.CharField(
widget=forms.Textarea(attrs={'rows': 3}),
help_text='A description of the content in this video.')
category = forms.ModelChoiceField(
queryset=Category.objects.all(),
required=True)
receiver = forms.ModelMultipleChoiceField(
queryset=EmployeeType.objects.all(),
required=True,
widget=forms.CheckboxSelectMultiple,
help_text='Employees in these groups will be able to view the video.')
video_file = forms.FileField()
thumbnail = forms.ImageField(required=False)
class Meta:
model = Video
fields = (
'title',
'description',
'receiver',
'category',
'video_file',
'thumbnail',
)
widgets = {
'date_time': forms.HiddenInput(),
'sender': forms.HiddenInput(),
'unviewed': forms.HiddenInput(),
'viewed': forms.HiddenInput(),
}
def __init__(self, *args, **kwargs):
super(BaseVideoUploadForm, self).__init__(*args, **kwargs)
self.fields['receiver'].label = "Viewers"
self.fields['receiver'].queryset = EmployeeType.objects.all()
self.fields['category'].queryset = Category.objects.all()
class VideoUploadForm(BaseVideoUploadForm):
send_notifications = forms.BooleanField(
required=False,
help_text='Send viewers a notification about the new video.')
class Meta(BaseVideoUploadForm.Meta):
fields = BaseVideoUploadForm.Meta.fields + ('send_notifications', )
class VideoUpdateView(UpdateView):
model = Video
form_class = VideoUploadForm
url.py:
class VideoUploadView(FormView):
form_class = VideoUploadForm
success_url = '/videos'
template_name = 'videos/video_form.html'
def get(self, request, *args, **kwargs):
form = self.form_class()
return render(request, self.template_name, {'form': form})
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST, request.FILES)
form.instance.sender = self.request.user
if form.is_valid():
form.save()
# doing stuff
form.save()
messages.success(self.request, self.success_message)
if request.is_ajax():
return JsonResponse({'success': True, 'url': reverse('videos-home')})
else:
return redirect(self.success_url)
else:
if request.is_ajax():
return JsonResponse({'success': False, 'error': form.errors})
else:
return render(request, self.template_name, {'form': form})
urlpatterns = [
path('', views.VideoListView.as_view(), name='videos-home'),
path('upload/', views.VideoUploadView.as_view(), name='videos-upload'),
path('<int:pk>', VideoDetailView.as_view(), name='videos-detail'),
path('<int:pk>/delete/', VideoDeleteView.as_view(), name='videos-delete'),
path('<int:pk>/viewed/', views.mark_as_viewed, name='mark-as-viewed'),
path('<int:pk>/update/', VideoUpdateView.as_view(), name='videos-update'),
path('<int:pk>/notify', VideoNotificationView.as_view(), name='videos-notify'),
]
urlpatterns=[
路径(“”,views.VideoListView.as_view(),name='videos-home'),
路径('upload/',views.VideoUploadView.as_view(),name='videos-upload'),
路径(“”,VideoDetailView.as_view(),name='videos-detail'),
路径('/delete/',VideoDeleteView.as_view(),name='videos-delete'),
路径('/viewsed/',views.mark_as_viewsed,name='mark-as-viewsed'),
路径('/update/',VideoUpdateView.as_view(),name='videos-update'),
路径('/notify',VideoNotificationView.as_view(),name='videos-notify'),
]
如何使
UpdateView
不依赖FormView
?或者使用窗体视图
?似乎所有的UpdateView
都指向了FormView
验证错误将来自表单,而不是FormView。如果您遇到验证错误,那么您需要更改输入或验证规则以符合您的期望。您能举一个如何更改我的验证的示例吗?我使用AJAX提交表单,FormView
就是返回响应的内容。FWIW我已经在这方面工作了好几天,但无法解决它。您实际上还没有共享表单的任何代码或表单上的验证。但考虑到你发布的示例错误;如果您希望能够拥有多个具有相同标题的视频,则需要在视频模型或VideoUploadForm类上进行更改。好的,那么视频模型如何?Video.title的定义中是否有unique=True
?我没有分享它,因为我认为它不相关。模型的标题
字段设置为unique=True
,因为我不想要重复项。这是一个更新视图
。我正在尝试更新模型实例。