Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何让UpdateView使用通用FormView_Django_Python 3.x - Fatal编程技术网

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
,因为我不想要重复项。这是一个
更新视图
。我正在尝试更新模型实例。