Django шаблон не получает значения из URL - PullRequest
0 голосов
/ 15 января 2020

Добрый день Django Эксперты и энтузиасты!

У меня следующая ситуация (исходный код находится в конце этого поста):

У меня есть один шаблон, который используется DetailView для post модели (то есть show деталь конкретного экземпляра поста). В этом шаблоне у меня есть context_object_name post в шаблоне - у этого объекта есть идентификатор. В этом DetailView есть URL-ссылка на другой шаблон CreateView. Это представление создания для комментария модели. Между post и comment существует связь по внешнему ключу - один пост может содержать 0 - больше комментариев.

Когда я нажимаю на DetailView для post , у меня есть ссылка для CreateView для комментария. Когда пользователь пишет комментарий к сообщению и нажимает кнопку сохранения , мне нужно, чтобы post.id был доступен в шаблоне в шаблоне для CreateView (я хотел бы отправить его как скрытое поле в форме для комментария, чтобы что comment модель имеет post.id, доступный в методе save () - это покрывает необходимость использования внешнего ключа при сохранении comment ).

Теперь по существу моей проблемы:

Я хотел бы отправить post.id из шаблона DetailView в шаблон CreateView (чтобы я мог использовать его как скрытую форму). Проблема в том, что post.id не получен шаблоном для CreateView для комментариев. Исходный код, отвечающий моим потребностям, выглядит следующим образом:

Шаблон для DetailView (из post ), а именно URL-адрес, ссылающийся на CreateView (для comment ):

<a  class="btn btn-danger" href="{% url 'commentpost' post_id=post.id %}">Reagovat</a>

Строка для уровня приложения urls.py, заботящаяся о commentpost URL:

path('commentpost/<int:post_id>/',CommentPostView.as_view(),name='commentpost')

Я думал, что шаблон для URL поста комментария должен иметь доступное значение {{ post_id }} ... однако, чем пустое в шаблон поста комментария -> строка в шаблоне для поста комментария: <tr><td>ID:{{ post_id }}</td></tr>.

CreateView для комментария:

class CommentPostView(CreateView):
    model = Comment
    context_object_name = 'comment'
    form_class = NewCommentForm
    template_name = 'new_comment.html'

Модель для комментария:

class Comment(models.Model):
    post = models.ForeignKey(Post,on_delete=models.CASCADE)
    author = models.CharField(max_length = 100, choices = DEPARTMENTS)
    date_sent = models.DateTimeField()
    text = models.TextField(max_length = 255)

В основном процесс должен быть следующим: 1) отправка шаблона DetailView post_id -> 2) urls.py, заботящийся о значении post_id - вызов правильного представления 3) просмотр рендеринга шаблона и получение шаблона post_id ценность.

Я на 100% уверен, что значение post_id на шаге 1) не пусто. URL для шага 1), т.е. DetailView выглядит следующим образом: http://192.168.56.101:8080/detailpost/1360

Кто-нибудь из вас имеет представление о том, что мне не хватает?

Большое спасибо заранее за любые предложения, берегите себя.

Ответы [ 2 ]

0 голосов
/ 15 января 2020

@ Radico ответит хорошо. Другой подход заключается в том, чтобы получить объект в представлении (это если вам нужны другие поля помимо id). В шаблоне вы получите к нему доступ object.id

def get_object(self, queryset=None):
    return get_object_or_404(Post, pk=self.kwargs['post_id'])
0 голосов
/ 15 января 2020

get_context_data метод сделает post_id доступным в шаблоне:

class CommentPostView(CreateView):
    model = Comment
    context_object_name = 'comment'
    form_class = NewCommentForm
    template_name = 'new_comment.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['post_id'] = self.kwargs.get('post_id', None)
        return context
...