Nano Hash - криптовалюты, майнинг, программирование

Попытка отправить форму в представление, но не удается получить правильный «post_id», который требуется для представления.

У меня есть форма, созданная в 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

Что было бы легко сделать, но немного менее удобно для пользователя, так это иметь ссылку под каждым сообщением, которая перенаправляет на страницу комментариев. Затем на странице комментариев у вас будет доступ к идентификатору сообщения, потому что вы можете получить его через 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. .

15.05.2018
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..