Отзыв юзера, как сделать это правильно?

Всем привет.

Ситуация:

Есть модель Course (курс) - есть модель Creview (Отзыв курса) - Есть стандартная модель User (пользователь). Задача сделать так, чтобы авторизованные пользователи могли оставлять свои отзывы.

Как я сделал:

models.py

class Course(models.Model):
    ....

class Creview(models.Model):
    creview = models.ForeignKey(Course, on_delete=models.CASCADE, default=1)
    userview = models.ForeignKey(User, on_delete=models.CASCADE, default=1)   
    review = models.TextField(help_text="Отзыв", verbose_name="Сам отзыв о курсе")


forms.py

class CreviewForm(forms.Form):
    review = forms.CharField(widget=forms.Textarea, label='Ваш отзыв', required=False)


html.страница

<form action="/addcreview{{ courseitem.id }}" method="post">
                                        {% csrf_token %}
                                        <input type="hidden" name="userfromform" value="{{ user.id }}">
                                        {{ form.as_p }}
                                        <input type="submit" class="expanded button" value="ОПУБЛИКОВАТЬ">
                                    </form>


view.py

def addcreview(request, add_id):
    token = csrf(request)
    if request.POST:
        course = Course.objects.get(id = add_id)
        user_id =  request.POST.get('userfromform', '')
        user = User.objects.get(id = user_id)
        form = CreviewForm(request.POST)
        if form.is_valid():
            review = form.cleaned_data['review']
            review_obj = Creview(creview=course, userview=user, review=review)
            review_obj.save()
            return redirect('/course'+ add_id, token)


И вся эта штука работает так:

Я ручками передаю в html ID текущего юзера, и форму. Во время клика по кнопку "Добавить" я также передаю id текущего курса и:

  1. Нахожу объект текущего курса
  2. Нахожу объект текущего юзера
  3. Забираю текст из формы.
  4. Создаю новый объект отзывы, в который передаю все данные.


Работает, но мне кажется, что я как-то не так это делаю. Как можно это все дело сделать правильно?
  • Вопрос задан
  • 614 просмотров
Решения вопроса 1
@deliro
Конечно что-то не так. Названия классов и атрибутов свои посмотри.

А еще юзера в скрытом поле передавать... Так можно отзывы от других людей писать. У тебя юзер получается через request.user
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
winordie
@winordie
Лучшая документация -- исходники
models.py
class Creview(models.Model):
    ...
    def get_absolute_url(self):
        return reverse('course_review', kwargs={'pk': self.id})

url.py
...
url(r'^creview/(?P<pk>\d+)/$', DetailCourseReview.as_view(), name='course_review'),
url(r'^creview/(?P<course_id>\d+)/create/$', login_required(CreateCourseReview.as_view()), name='create_course_review'),
...

forms.py
class CourseReviewForm(forms.ModelForm):
    class Meta:
        model = Creview
        fields = ['review']

    def __init__(self, user, course, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.instance.creview = course
        if user and user.is_authenticated():
            self.instance.userview = user

views.py
class DetailCourseReview(DetailView):
    model = Creview


class CreateCourseReview(CreateView):
    model = Creview
    form_class = CourseReviewForm
    template_name = 'course_review.html'

    def dispatch(self, request, *args, **kwargs):
        course_id = kwargs.get('course_id')
        self.course = get_object_or_404(Course, pk=course_id)

        super().dispatch(request, *args, **kwargs)

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()

        kwargs['user'] = self.request.user
        kwargs['course'] = self.course

        return kwargs

course_review.html
<form action="{% url "create_course_review" course_id=course.id %} method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="{% trans "Send" %}">
</form>
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы