Я использую универсальный 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: {}>
}