Джанго Комментарии Новичок

Я начал изучать Django около месяца назад и только что закончил Django for Beginners Уильяма Винсента. Книга заканчивается главой 15: Комментарии и показывает, как администратор может добавлять комментарии к сообщениям.

В: Может кто-нибудь, пожалуйста, показать мне или указать мне правильное направление относительно того, как я могу позволить зарегистрированным пользователям также добавлять комментарии к сообщениям? Возможно, для этого есть стороннее приложение?

Что у меня есть до сих пор:

Модели:

class Article(models.Model):
title  = models.CharField(max_length=255)
body   = models.TextField()
date   = models.DateTimeField(auto_now_add=True)
image  = models.ImageField(upload_to='images/', null=True, blank=True, height_field=None, width_field=None)
upload = models.FileField(upload_to='files/', null=True, blank=True)
author = models.ForeignKey(
    get_user_model(),
    on_delete=models.CASCADE,
)

def __str__(self):
    return self.title

def get_absolute_url(self):
    return reverse('article_detail', args=[str(self.id)])

class Comment(models.Model):
article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='comment')
comment = models.CharField(max_length=140)
date    = models.DateTimeField(auto_now_add=True)
author  = models.ForeignKey(
    get_user_model(), on_delete=models.CASCADE,
)

def __str__(self):
    return self.comment

def get_absolute_url(self):
    return reverse('article_list')

forms.py

class PostForm(forms.ModelForm):
class Meta:
    model = Article
    fields = ('title', 'body', 'image', 'upload')

class CommentForm(forms.ModelForm):
class Meta:
    model  = Comment
    fields = ('comment', 'author')

Просмотры:

class ArticleListView(LoginRequiredMixin, ListView):
model         = Article
template_name = 'article_list.html'
comment_form  = CommentForm
login_url     = 'login'

class ArticleDetailView(LoginRequiredMixin, DetailView):
model         = Article
template_name = 'article_detail.html'
login_url     = 'login'

class ArticleUpdateView(LoginRequiredMixin, UpdateView):
model         = Article
fields        = ('title', 'body', 'image', 'upload')
template_name = 'article_edit.html'
login_url     = 'login'

def dispatch(self, request, *args, **kwargs):
    obj = self.get_object()
    if obj.author != self.request.user:
        raise PermissionDenied
    return super().dispatch (request, *args, **kwargs)

class ArticleDeleteView(LoginRequiredMixin, DeleteView):
model         = Article
template_name = 'article_delete.html'
success_url   = reverse_lazy('article_list')
login_url     = 'login'

def dispatch(self, request, *args, **kwargs):
    obj = self.get_object()
    if obj.author != self.request.user:
        raise PermissionDenied
    return super().dispatch (request, *args, **kwargs)

class ArticleCreateView(LoginRequiredMixin, CreateView):
model         = Article
form_class    = PostForm
template_name = 'article_new.html'
login_url     = 'login'

def form_valid(self, form):
    form.instance.author = self.request.user
    return super().form_valid(form)

URL-адреса:

urlpatterns = [
path('<int:pk>/edit/', ArticleUpdateView.as_view(), name='article_edit'),
path('<int:pk>/', ArticleDetailView.as_view(), name='article_detail'),
path('<int:pk>/delete/', ArticleDeleteView.as_view(), name='article_delete'),
path('', ArticleListView.as_view(), name='article_list'),
path('new/', ArticleCreateView.as_view(), name='article_new'),]

Спасибо за внимание.


person codingunicorn    schedule 13.06.2020    source источник
comment
Редактировать: я пытался сказать «Привет всем», но эта строка каждый раз удаляется? Так что просто поздоровайтесь с сообществом здесь. Буду признателен за любые указатели. Ваше здоровье   -  person codingunicorn    schedule 13.06.2020
comment
Не могли бы вы уточнить больше о том, что вы подразумеваете под формой пользователя, UserLoginform или полем для комментариев или что   -  person Ahmed Al-Haffar    schedule 13.06.2020
comment
Привет, Ахмед, конечно. Как я понимаю, для другого пользователя, чтобы добавить данные, которые в дальнейшем хранятся в базе данных, мне нужно работать с формами django, верно? Я думаю, что мне не хватает чего-то в моем view.py, я действительно не уверен. Я хотел бы добавить поле для комментариев прямо под сообщением, где пользователь может оставить комментарий. Я довольно новичок во всем этом, поэтому, пожалуйста, потерпите меня.   -  person codingunicorn    schedule 13.06.2020
comment
Добро пожаловать в Stack Overflow! Мы не очень любим приветствия и благодарности в сообщениях здесь: это более формальный сайт, чем многие другие форумы.   -  person Adrian Mole    schedule 13.06.2020
comment
DetailView для article-detail будет генерировать object, который является article/pk/, поэтому в вашем шаблоне вы можете сделать что-то вроде ‹h1›{{ object.title }}‹/h1› ‹p›{{ object.body }} ‹/p›, и после этого вы можете создать форму в шаблоне HTML, чтобы отображать текстовое поле только для поля комментариев. затем в представлении вы можете создать новый комментарий, в котором значение автора из request.user и комментарий можно получить с помощью request.POST['имя текстового поля в форме']   -  person Ahmed Al-Haffar    schedule 13.06.2020
comment
@AdrianMole Спасибо за теплый прием. Заметано :)   -  person codingunicorn    schedule 16.06.2020
comment
@ AhmedAl-Haffar Думаю, я правильно понял форму в своем html-шаблоне. Я совершенно уверен, что на данный момент я что-то испортил в своем views.py.   -  person codingunicorn    schedule 16.06.2020
comment
def add_comment(запрос, pk): article = get_object_or_404(Article, pk=pk) if request.method == POST: form = CommentForm(request.POST) if form.is_valid(): comment = form.save(commit=False ) comment.article = article comment.save() return redirect('post_detail', pk=article.pk) else: form = CommentForm() return render(request, 'add_comment.html', {'form': form})   -  person codingunicorn    schedule 16.06.2020


Ответы (1)


Решено. В моем views.py я добавил следующую функцию:

def add_comment(request, pk):
article = get_object_or_404(Article, pk=pk)
if request.method == "POST":
    form = CommentForm(request.POST)
    if form.is_valid():
        comment = form.save(commit=False)
        comment.article = article
        comment.save()
        return redirect('article_detail', pk=article.pk)
else:
    form = CommentForm()
return render(request, 'add_comment.html', {'form': form})

Затем в шаблоны был добавлен следующий файл .html:

add_comment.html

{% extends 'base.html' %}
{% block content %}
<h4>Add a Comment</h4>
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
<p>{{ form.as_p }}</p>
<button type="submit" class="btn btn-success">Submit</button>
</form>
{% endblock content %}

PS: сначала я получал сообщение ImportError: невозможно импортировать имя "add_comment" из "articles.views". Я думал, что это проблема циклического импорта, и мне помогло просто получить def add_comment отступ справа.

person codingunicorn    schedule 29.06.2020