Сразу говорю, что в документации ответа не нашёл (да, возможно невниматильно искал... но если там есть это - покажите, где). Такое ощущение, что логику неверную прописал.
Реализовал добавление комментариев с помощью mptt, но пока что это работает только с админки. Не могу понять, что и куда прикрутить, чтобы заработало добавление из сайта. Вот, что реализовал пока.
Если я правильно понимаю, то логика должна быть такова:
- Есть url, который отправляется на определённую функцию во views.py.
- Вьюха вытаскивает форму из forms.py и передаёт её в шаблон.
- Юзер заполняет эту форму и через POST запрос отдаёт данные обратно в эту функцию во views.py.
- Вьюха обрабатывает данные и отправляет их обратно в шаблон, уже сформированные.
Как я понимаю, на третьем этапе вьюха должна получать parent и добавлять комментарий в список уже существующих комментариев. Вроде, логика понятна, но с реализацией запутался. В интернете не сумел найти решения
модель
class Feedback(MPTTModel):
author = models.ForeignKey(User, verbose_name='Автор')
content = models.TextField(blank=True, null=True, verbose_name='Комментарий')
parent = TreeForeignKey('self', blank=True, null=True, related_name='child')
date = models.DateTimeField(default=datetime.now, blank=True)
форма
class FeedbackForm(forms.ModelForm):
class Meta():
model = Feedback
fields = ('content',)
Изначально была такая вьюха
def comments_view(request):
comment_form = FeedbackForm(request.POST)
#Тут начинается веселье
if comment_form.is_valid():
content = comment_form.cleaned_data['content']
comment = Feedback()
comment.content = content
#Но как получить другие поля, в частности parent? Или же они автоматичски добавились уже?
comment.save()
return render(request, 'feedback/comment.html', {'comment_form':comment_form, 'comments': Feedback.objects.all()})
шаблон
Шаблон выглядит так.
То бишь есть кнопка "Добавить отзыв" и есть кнопки комментировать. Нужно как-то вытаскивать parent из них?.. И если человек кликнул по кнопке "Добавить отзыв", то parent у него нет,а если кликнул на "Комментировать"?.. Это нужно на стороне JS реализовывать? Или можно без этого обойтись?
Вот форма кнопки "Добавить отзыв" (всё лишнее убрал). Кажется я в инпуте ещё налажал...
<form action='' method='post' role="form" class="form-horizontal form-without-legend default-form">
{{ comment_form.content }}
{% if node.parent_id %}
<input type="hidden" name="parent" id="parent_id" value="{{ node.id }}" />
{% endif %}
<button class="btn btn-default">Отправить</button>
</form>
<a href="#" class="answer-btn inline-bloc">Комментировать</a>
Но посидев я пришёл к такому алгоритму
Нужно, чтобы по нажатию на ссылку "Комментировать" срабатывала кнопка "Добавить отзыв" (и чтобы туда передавался айдишник родительского комментария). В JS/Ajax я не силен, не знаю, как это сделать(
Максимум, что я сумел - это вытащить айдишник родителя при нажатии на кнопку "Комментировать"
<a href="#" class="answer-btn inline-bloc" data-id={{node.parent_id}}>Комментировать</a>
$(document).ready(function(){
$('.inline-bloc').on('click', function(e){
e.preventDefault()
parent_id = $(this).attr('data-id')
data = {
parent_id: parent_id
}
$.ajax({
type: "GET",
url: '{% url 'comments' %},
data: data,
`....`
Хотя мне кажется, что это я сделал зря, ведь в форме уже что-то прописано об айди...
Вот, затем я пытался сделать так.
def comments_view(request):
comment_form = FeedbackForm(request.POST)
comments = Feedback.objects.all()
if comment_form.is_valid():
content = comment_form.cleaned_data['content']
new_comment = Feedback()
new_comment.author = request.user
new_comment.parrent = request.GET.get("parent_id")
new_comment.content = content
#Дата по идее должна автоматически подтягиваться.
#Здесь я пробовал добавить новый коммент в дерево
comments.append(new_comment)
return render(request, 'feedback/comment.html', {'comment_form':comment_form, 'comments': comments})
Вылетела ошибка, типа у дерева нет метода append
И тут я зашёл в тупик.
В общем, 2 вопроса:
1. Нужно сделать, чтобы при нажатию на "Комментировать" срабатывала кнопка "Добавить отзыв", так как там спрятана форма. И передавался айдишник родителя.
2. Нужно чтобы добавлялся коммент в дерево. Может, метод какой есть добавления элемента в дерево, а может я логику неверную прописал? В документации mptt метода добавления не нашёл...(
Updated 23 Feb. 2019, 14:44 by m0nte-cr1st0.