Метод get_initial () в Django не работает должным образом - PullRequest
0 голосов
/ 22 июня 2019

Я использую универсальный CreateView от django для создания системы комментариев для моего сайта. Пользователь может оставлять комментарии к фильму. Вот мой комментарий модель-

class Comment(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="comments", on_delete=models.CASCADE)
    body = models.TextField()
    movie = models.ForeignKey(Movie, related_name="comments", on_delete=models.CASCADE) 
    created = models.DateField(auto_now_add=True)
    updated = models.DateField(auto_now=True)

    class Meta:
        ordering = ('created',)

    def __str__(self):
        return "comment by {} on {}".format(self.user.first_name, self.movie)

Вот CreateView, который я использую -

class AddComment(LoginRequiredMixin, CreateView):
    form_class = CommentForm

    def get_initial(self):
        initial = super().get_initial()
        #for providing initial values to the form
        initial['user'] = self.request.user.id
        initial['movie'] = self.kwargs['movie_id']
        return initial

    def get_success_url(self):
        movie_id = self.kwargs['movie_id']
        return reverse('detail', kwargs={'pk':movie_id})

    def render_to_response(self, context=None, **response_kwargs):
        movie_id = self.kwargs['movie_id']
        return redirect(to = reverse('detail', kwargs={'pk':movie_id}))

Вот форма комментария -

class CommentForm(forms.ModelForm):
    user = forms.ModelChoiceField(widget=forms.HiddenInput, queryset=get_user_model().objects.all())
    movie = forms.ModelChoiceField(widget=forms.HiddenInput, queryset=Movie.objects.all())

    class Meta:
        model = Comment
        fields = ('user','movie', 'body')

Я пытаюсь связать комментарий с пользователем и фильмом. Таким образом, я использовал метод get_initial () для заполнения формы начальными данными, потому что пользователь и фильм не присутствовали в опубликованных данных. Но почему-то всегда form.is_valid () оказывается ложным. Я не знаю, где я ошибся. Пожалуйста, помогите.

Если это поможет, я попытался отладить свою программу, распечатав значение kwargs, которое использовалось для создания экземпляра объекта формы, переопределив функцию get_form_kwargs-

{
'initial': {'user': 1, 'movie': 2}, 'prefix': None, 
'data': <QueryDict: {'csrfmiddlewaretoken': ['wFmkOMLAcIszMc17GsBsqPhyaZnJEXb0TRNteKd9sgjYKEF3jvqwsQ3Noik3DHq6'], 'body': ['best movie ever\r\n'], 'user': [''], 'movie': ['']}>, 'files': <MultiValueDict: {}>
}

1 Ответ

0 голосов
/ 22 июня 2019

Итак, пользователь и фильм - это поля внешнего ключа, поэтому они ожидают получить объект связанных моделей в качестве инициалов. Вы пытаетесь использовать pk (int) вместо этих объектов. Это должно быть примерно так:

 def get_initial(self):
        initial = super().get_initial()
        #for providing initial values to the form
        initial['user'] = self.request.user 
        initial['movie'] = Movie.objects.get(pk=movie_id)
        return initial.copy()



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