【问题标题】:Django generic view initial value in form表单中的 Django 通用视图初始值
【发布时间】:2020-07-14 17:08:28
【问题描述】:

我想在我的表单中有默认值,这应该是当前用户的选择。例如,用户选择为一部电影提供 5,他应该在表单中看到 5,直到他更改它。

views.py

class MovieDetailView(FormMixin, DetailView):
    model = Movie
    template_name = 'main/detail_movie.html'
    context_object_name = 'movie'
    form_class = RateForm

    def get_context_data(self, **kwargs):
        context = super(MovieDetailView, self).get_context_data(**kwargs)
        context['form'] = RateForm(initial={'movie': self.object})
        context['my_rate'] = Rate.objects.filter(
                sender=self.request.user,
                movie=self.get_object()).first()
        return context

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        form = self.get_form()
        if request.method == 'POST':
            if form.is_valid():
                new_rate, _ = Rate.objects.update_or_create(
                sender=self.request.user, 
                movie=self.object,
                defaults={'choice': form.cleaned_data['choice']}
            )
                return JsonResponse({'rate': model_to_dict(new_rate)}, status=200)
        else:
            return self.form_invalid(form)

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

我正在尝试 get_initial 方法,但它仍然默认为我提供“---”形式。

def get_initial(self):
        return {'choice': Rate.objects.filter(movie=self.object, sender=self.request.user).first().choice }

即使这样也行不通

def get_initial(self):
        return {'choice': 1 }

【问题讨论】:

    标签: python django forms


    【解决方案1】:

    把它放在你的表单中。

    form = RateForm(initial={'choice': 1})

    【讨论】:

    • 我像这个 form = self.get_form() 一样初始化它,我不能按照你的方式这样做......
    【解决方案2】:

    如果你想使用FormMixinget_initial方法你需要在get_context_data中使用get_form方法

    class MovieDetailView(FormMixin, DetailView):
        model = Movie
        template_name = 'main/detail_movie.html'
        context_object_name = 'movie'
        form_class = RateForm
    
        def get_initial(self):
            initial = super(MovieDetailView, self).get_initial()
            initial['movie'] = self.object # selected movie
            rate = Rate.objects.filter( # attempt to get rate
                movie=self.object,
                sender=self.request.user
            ).first()
            if rate is not None: # set rate choice only if it has been done before
                initial['choice'] = rate.choice
            return initial
    
        def get_context_data(self, **kwargs):
            context = super(MovieDetailView, self).get_context_data(**kwargs)
            context['form'] = self.get_form() # use from mixin instead manual init
            return context
    
        def post(self, request, *args, **kwargs):
            self.object = self.get_object()
            form = self.get_form()
            if request.method == 'POST':
                if form.is_valid():
                    new_rate, _ = Rate.objects.update_or_create(
                    sender=self.request.user, 
                    movie=self.object,
                    defaults={'choice': form.cleaned_data['choice']}
                )
                    return JsonResponse({'rate': model_to_dict(new_rate)}, status=200)
            else:
                return self.form_invalid(form)
    
        def get_success_url(self):
            return reverse('detail_movie', kwargs={'slug': self.object.slug})
    

    【讨论】:

    • 谢谢,这是我找到解决方案的好建议。
    【解决方案3】:

    好的,我只需要输入 'choice': Rate.objects.filter(movie=self.object, sender=self.request.user).first().choice 到我的context['form'] 那里我已经有了首字母:

    def get_context_data(self, **kwargs):
            context = super(MovieDetailView, self).get_context_data(**kwargs)
            context['form'] = RateForm(
            initial={
            'movie': self.object,
            'choice': Rate.objects.filter(movie=self.object, sender=self.request.user).first().choice
            })
            context['my_rate'] = Rate.objects.filter(
                    sender=self.request.user,
                    movie=self.get_object()).first()
            return context
    

    【讨论】:

      猜你喜欢
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 2013-02-22
      • 1970-01-01
      • 1970-01-01
      • 2012-07-30
      • 1970-01-01
      • 2012-03-23
      相关资源
      最近更新 更多