Django generic view initial value in form

徘徊边缘 提交于 2021-02-20 04:44:28

问题


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})

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 }

回答1:


Put this in your form.

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




回答2:


If you want to use FormMixin and get_initial method you need to use get_form method in get_context_data

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:


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


来源:https://stackoverflow.com/questions/62900395/django-generic-view-initial-value-in-form

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!