Как собрать пк модели, которую вы сейчас просматриваете (django)

Эй, я пытаюсь сделать проект вопросов и ответов для django, как мне получить pk вопроса, который я просматриваю прямо сейчас, чтобы отправить ответ? Я уже настроил его так, что url ответа имеет /answer/pk вопроса, но я не знаю, как получить эту информацию, чтобы код знал, где разместить модель, как мне это сделать? Также вот мой код, спасибо!

просмотров:

class AnswerForm(SuccessMessageMixin, CreateView):
    template_name = 'forum/answer-question.html'
    model = Answer
    form_class = AnswerForm
    success_message = 'Success!'
    
    def form_valid(self, form, pk=None):
        form.instance.question_id = Question.objects.only('id')
        form.instance.user = self.request.user
        form.save()
        return super().form_valid(form)

формы:

class AnswerForm(ModelForm):
    class Meta:
        model = Answer
        fields = ['detail']
        exclude = ('user', 'add_time')

Урлы:

from django.urls import path from . import views

urlpatterns = [
    path('questions/', views.QuestionsView.as_view(), name='questions'),
    path('ask/', views.AskForm.as_view(), name='ask'),
    path('answer/', views.AnswerForm.as_view(), name='answer'),
    path('answer/<pk>', views.AnswerForm.as_view(), name='answer_with_pk'),
    path('question/<pk>', views.QuestionDetailView.as_view(), name='detail'),
    path('save-text', views.WriteCommentAnswerView.as_view(), name='save-text'),
    path('save-vote', views.SaveVoteView.as_view(), name='save-vote'),
]

модели:

class Answer(VoteModel, models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    detail = models.TextField()
    add_time = models.DateTimeField(auto_now_add=True)
    
    def get_absolute_url(self):
        return f"/questions/"

    def __str__(self):
        return self.detail

В AnswerForm вы получаете все параметры url, добавленные к self из-за базового класса DetailedView. В вашем случае "self.pk". Затем вы можете добавить что угодно в контекст для рендеринга html, реализовав get_context_data:

def get_context_data(self, **kwargs):
    # Call the base implementation first to get a context
    context = super().get_context_data(**kwargs)
    # Add in the publisher
    context['question_pk'] = self.pk
    return context

Смотрите https://docs.djangoproject.com/en/4.0/topics/class-based-views/generic-display/

Вернуться на верх