Django generi c просмотреть начальное значение в форме - PullRequest
0 голосов
/ 14 июля 2020

Я хочу, чтобы в моей форме было значение по умолчанию, которое должно быть выбрано текущим пользователем. Например, пользователь хочет указать 5 для mov ie, и он должен видеть 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 }

Ответы [ 3 ]

0 голосов
/ 14 июля 2020

Если вы хотите использовать метод FormMixin и get_initial, вам необходимо использовать метод get_form в 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})
0 голосов
/ 14 июля 2020

Хорошо, мне просто нужно было ввести '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
0 голосов
/ 14 июля 2020

Поместите это в свою форму.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...