Django通用视图形式的初始值 [英] Django generic view initial value in form

查看:39
本文介绍了Django通用视图形式的初始值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望表单中具有默认值,该默认值应为当前用户的选择.例如,用户选择为一部电影给5分,他应该看到5种形式,直到他对其进行更改.

i want to have default value in my form which should be current user's choice. For example, user chooses to give 5 for a movie and he should see 5 in form until he changes it.

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方法,但默认情况下仍会以格式显示"---".

I was trying get_initial method but it still gives me '---' in form as default.

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

即使这样的东西也不起作用

Even something like this doesn't work

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

推荐答案

好,我只需要输入'choice':Rate.objects.filter(movie = self.object,sender = self.request.user).first().choice 到我已经有初始姓名的 context ['form'] 处:

Ok, i just had to input 'choice': Rate.objects.filter(movie=self.object, sender=self.request.user).first().choice to my context['form'] where i already had initial:

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

这篇关于Django通用视图形式的初始值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆