Попытка отправить форму представлению, но не могу получить правильный 'post_id', который требуется представлению. - PullRequest
0 голосов
/ 14 мая 2018

У меня есть форма, созданная в comments / forms.py

from django import forms

from .models import Comment

class CommentForm(forms.ModelForm):

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

эта форма имеет шаблон в comments / comment_form.html:

<h2>this is the comment form</h2>
<form class="post-form" method="post" action="{% url 'comments:create' post.id %}">
  {% csrf_token %}
  {{ form.as_p }}
  <button type="submit" class="save btn btn-default">Save</button>
</form>

как видите, я отправляю эту форму для комментариев: создайте. это представление для обработки формы:

def create(request, post_id):
    post =  get_object_or_404(Post, pk= post_id)
    group = post.group



     if request.method == "POST":
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            comment.author = request.user
            comment.post = post
            comment.pub_date = timezone.now()
            comment.save()
            return redirect('/groups/' + str(group.id))

    else:
        form = CommentForm()
    return render(request, 'comments/comment_form.html', {'form':form})

Проблема в том, что я отрисовываю форму в 'groups / detail.html':

{% include "comments/comment_form.html" %}

проблема в том, что эта форма явно требует post_id, потому что комментарий принадлежит посту. Вопрос в том, что я не имею доступа к индивидуальному посту на странице с информацией о группах, или, по крайней мере, я не знаю, как получить доступ к индивидуальному посту. ниже приведен подробный вид группы:

def detail(request, group_id):
    group = get_object_or_404(Group, pk= group_id)
    posts = Post.objects.filter(group__id = group_id)
    post = posts.objects.first()


    form = CommentForm(request.POST)

    return render(request, 'groups/detail.html', {'group': group, 'posts':posts, 'post':post, 'form':form})

Как видите, я просто взял первый пост (для целей тестирования), хотя это не то, что я хочу. Я хочу получить пост, для которого был сделан комментарий. Я не могу получить его из URL, потому что нет смысла включать post_id для страницы сведений о группе. Вот URL для страницы сведений о группах:

app_name = 'groups'

urlpatterns = [

    path('<int:group_id>/', views.detail, name='detail'),

]

Я просто хочу знать, есть ли способ получить отдельный пост на странице сведений о группе, чтобы я мог отправить форму в комментарии: создать представление, которое обрабатывает его правильно. для просмотра комментариев необходимо указать post_id:

def create(request, post_id):
    post =  get_object_or_404(Post, pk= post_id)
    group = post.group

    if request.method == "POST":
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            comment.author = request.user
            comment.post = post
            comment.pub_date = timezone.now()
            comment.save()
            return redirect('/groups/' + str(group.id))

    else:
        form = CommentForm()
    return render(request, 'comments/comment_form.html', {'form':form})

короче говоря, мне нужно создать экземпляр переменной в подробном представлении группы, чтобы я мог передать ее в форму, чтобы она могла передать ее представлению для создания комментариев. есть идеи?

1 Ответ

0 голосов
/ 15 мая 2018

Что было бы легко сделать, но немного менее удобно для пользователя, это иметь ссылку под каждым постом, которая перенаправляет на страницу комментариев. Затем на странице комментариев у вас будет доступ к идентификатору записи, поскольку вы можете получить его по URL.

Это будет ваш HTML для ссылки на форму комментария под каждым сообщением:

postpage.html

{% for i in post %}
    {{ i.post }}
    <a href="/posts/{{i.pk}}">Comment on this Post!</a>
{% endfor %}

... затем перенаправляет на страницу формы комментария ...

URL формы комментария будет выглядеть так = ... / posts / [pk]

<h2>this is the comment form</h2>
<form class="post-form" method="post" action="">
  {% csrf_token %}
  {{ form.as_p }}
  <button type="submit" class="save btn btn-default">Save</button>
</form>

Убедитесь, что ваш шаблон URL поддерживает PK.

Тогда, по вашему мнению, у вас будет доступ к pk поста и вы можете назначить его комментарию.

Я скажу, что есть определенно более удобные для пользователя способы сделать это (например, всплывающее модальное окно для написания комментария, чтобы вам не пришлось покидать страницу), которое, вероятно, включало бы некоторую комбинацию наборов форм и JavaScript / AJAX.

...