ValidationError丢失了上下文

时间:2013-11-24 14:14:57

标签: django django-forms django-templates

在我的 forms.py 中,当用户已经是项目的成员时,我会引发验证错误。如果我尝试添加已经是成员的用户,则验证错误会得到完全提升,但之后我会被重定向到模板,我不再有上下文。

提出表单验证错误的最佳做法是什么?我究竟做错了什么?

class AddUserForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        self.project = kwargs.pop('project')
        self.user = kwargs.pop('user')
        super(AddUserForm, self).__init__(*args, **kwargs)
        self._user_cache = None

    def clean_user(self):
        """
        Check if the user is already a member of the project.
        """
        user = self.cleaned_data['user']

        if ProjectMember.objects.filter(project=self.project, user=user).exists():
            raise forms.ValidationError(_("User is already a member of this project."))

        # store user instance we queried for here to prevent additional lookups.
        self._user_cache = user

        return user
没有ProjectUpdate视图的

views.py ,因为在这种情况下无关紧要。视图有点复杂,因为我在一个模板中有2个表单。如果您知道更好的方法来实现这一点,请告诉我。

class ProjectDetailView(LoginRequiredMixin, View):

    def get(self, request, *args, **kwargs):
        view = ProjectDisplay.as_view()
        return view(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        if 'update_form' in request.POST:
            view = ProjectUpdate.as_view()
        elif 'add_user_form' in request.POST:
            view = ProjectAddUser.as_view()
        return view(request, *args, **kwargs)

class ProjectDisplay(DetailView):
    model = Project

    def get_context_data(self, **kwargs):
        context = super(ProjectDisplay, self).get_context_data(**kwargs)
        context['update_form'] = ProjectUpdateForm(initial={
            'name': self.object.name,
            'description': self.object.description
        })
        context['add_user_form'] = AddUserForm(project=self.object, user=self.request.user)
        context['project'] = self.object
        context['is_member'] = self.object.user_is_member(self.request.user)
        return context

class ProjectAddUser(CreateView):
    model = ProjectMember
    form_class = AddUserForm
    template_name = 'projects/project_detail.html'

    def get_success_url(self):
        return reverse('project_detail', kwargs={'slug': self.get_object().slug})

    def get_object(self, queryset=None):
        return Project.objects.get(slug=self.kwargs['slug'])

    def get_form_kwargs(self):
        kwargs = super(ProjectAddUser, self).get_form_kwargs()
        kwargs.update({'project': self.get_object()})
        kwargs.update({'user': self.request.user})
        return kwargs

0 个答案:

没有答案