多对多用户

时间:2018-02-04 18:32:20

标签: python-3.x django-models django-forms django-templates django-views

我慢慢地通过Django获得了我的知识,但是这个让我难过。我正在尝试创建一个多个用户需要批准的表单。在这样做的过程中,我创建了一个带有modelform的CreateView,并且工作正常。我还创建了一个UpdateView,这也很好用,但需要注意的是,如果一个用户更新模型表单,他们实际上是为每个人更新它。通过我的研究,我确定用户实际上应该更新表格的实例?但我似乎可以弄清楚如何做到这一点。这是我的代码模型。我试图将那些对这个问题不重要的代码排除在外。

我的模特

class Book(models.Model):

    approver = models.ManyToManyField(settings.AUTH_USER_MODEL,related_name='approver')

    def __str__(self):
        return self.quiz_name

CreateView的

class CreateBookView(LoginRequiredMixin,CreateView):

    model = Book
    form_class = CreateBook
    template_name = 'Book/create_book.html'

    def get_form_kwargs(self):
        kwargs = super(CreateBookView, self).get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

    def form_valid(self, form):
        self.object = form.save()
        self.object.checker.add()
        self.object.save()
        return HttpResponseRedirect(self.get_success_url())

    def get_success_url(self):
        return reverse('Test:book_test')

的ModelForm

class CreateBook(forms.ModelForm):

    class Meta:

        model = Book
        fields = ('approver',) 

        def __init__(self, user, *args, **kwargs):
        super(CreateBook, self).__init__(*args, **kwargs)
            self.fields['approver'] = forms.ModelMultipleChoiceField(
                                    widget=forms.CheckboxSelectMultiple(),
                                    queryset= User.objects.all())

的UpdateView

class BookUpdateView(LoginRequiredMixin,UpdateView):

    model = Book
    template_name = 'Test/book_update.html'
    form_class = ReviewNewBookForm
    success_url = reverse_lazy('Test:book_menu')

    def get_form_kwargs(self):
        kwargs = super(BookUpdateView, self).get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

的ModelForm

class ReviewNewBookorm(forms.ModelForm):

    class Meta:
        model = Book
        fields = ['approver',]

    def __init__(self, user, *args, **kwargs):
        super(ReviewNewBookForm, self).__init__(*args, **kwargs)
        self.fields['approver'].widget.attrs['class'] = 'choices3'
        self.fields['approver'].initial = " "

上面的代码完美无缺,除了我无法解决如何为每个被选中的审批者保存单独的表单实例。一个用户可以批准表单,表单立即更改为已批准。我尝试做的是选择多个批准者,这些批准者完全适用于CreateView,但是当涉及到UpdateView时,我无法弄明白。任何帮助或想法都表示赞赏。我试图在UpdateView中包含我在CreateView中的form_valid部分,但它似乎并不重要。我怀疑我必须在UpdateView的form_valid中做一些不同的事情但是无法弄明白。我在SO上发现了一个类似的问题,但它是使用基于函数的视图解决的,我正在为这个问题寻找一个稍微等同的基于类的视图,因为我的问题与这个问题不同,但是它是' s close ... Django UpdateView - get initial data from many-to-many field and add them when saving form

0 个答案:

没有答案