Система ответов блогов Django
Я пытаюсь создать мини-систему ответов, основанную на сообщениях пользователя в мини-блоге. У каждого поста есть ссылка с именем reply. если кто-то нажимает на ответ, появляется форма ответа, а один редактирует ответ и отправляет форму. Проблема в том, что я не знаю, как получить идентификатор сообщения, на которое я хочу ответить. В представлении, если я использую в качестве параметра один номер (как идентификатор сообщения в блоге), он вставляет ответ в базу данных. Но как я могу сделать это не жестко?
Вид:
def save_reply(request):
if request.method == 'POST':
form = ReplyForm(request.POST)
if form.is_valid():
new_obj = form.save(commit=False)
new_obj.creator = request.user
new_post = New(1) #it works only hardcoded
new_obj.reply_to = new_post
new_obj.save()
return HttpResponseRedirect('.')
else:
form = ReplyForm()
return render_to_response('replies/replies.html', {
'form': form,
},
context_instance=RequestContext(request))
у меня есть в forms.py:
class ReplyForm(ModelForm):
class Meta:
model = Reply
fields = ['reply']
и в моделях:
class Reply(models.Model):
reply_to = models.ForeignKey(New)
creator = models.ForeignKey(User)
reply = models.CharField(max_length=140,blank=False)
objects = NewManager()
упоминая, что New - это класс микроблогов
thanks
3 ответа
Привет там. Я решил проблему, используя ваши советы, но я создал другой. Я думал, что поскольку форма ответа находится на другой странице, простое нажатие на эту ссылку ответа не поможет мне в любом случае сохранить идентификатор записи, потому что страница блога исчезла после того, как я нажму кнопку ответа. Итак, на мой взгляд, я создал функцию, которая содержит идентификатор сообщения в блоге в качестве параметра. Это сохраняет, как и должно быть, без проблем, но теперь моя проблема: КАК МОЖЕТ ПРОЙТИ ССЫЛКУ, КАК
url(r'^save_reply/(?P<id>\d+)/$',
save_reply,
name='save_reply'),
(это то, что я держу в своем urls.py) на ответ под каждым постом? Я имею в виду, что до сих пор моя ссылка для ответа просто вызывала функцию replies/save_reply(у меня был Reply), но теперь, когда у меня есть id в качестве параметра, как я могу поместить его в мой href = 'what here'?
вот мой views.py, который работает правильно:
def save_reply(request, id):
if request.method == 'POST':
form = ReplyForm(request.POST)
if form.is_valid():
new_obj = form.save(commit=False)
new_obj.creator = request.user
u = New.objects.get(pk=id)
new_obj.reply_to = u
new_obj.save()
return HttpResponseRedirect('.')
else:
form = ReplyForm()
return render_to_response('replies/replies.html', {
'form': form,
},
context_instance=RequestContext(request))
и я звоню, набрав в браузере: http://127.0.0.1:8000/replies/save_reply/1/ (например), конечно, я удалил поле внешнего ключа, так как теперь оно не нужно
Спасибо!
Вам нужно иметь скрытое поле в форме, чтобы захватить PK любого экземпляра New, с которым связан комментарий.
Поскольку вы используете ModelForm, в вашей модели Reply уже установлено отношение ForiegnKey. Вы можете установить тип виджета как скрытый, чтобы ваши пользователи не видели его.
# forms.py
class ReplyForm(ModelForm):
class Meta:
model = Reply
fields = ['reply', 'reply_to']
widgets = {
'reply_to': forms.HiddenInput),
}
Когда вы инициализируете ReplyForm, вы можете заполнить поле reply_to следующим образом form = ReplyForm({'reply_to': new.pk})
- где new
это пример нового
Кстати, вы могли бы рассмотреть вопрос об изменении названия вашего New
модель что-то вроде Post
, "Новое" немного сложно говорить и немного сбивает с толку, так как "новое" обычно означает нечто совершенно иное в контексте программирования.
если нажать кнопку ответа, появится форма ответа,
Я думаю, что это та часть, над которой нужно работать. Когда форма ответа обрабатывается, ей нужно иметь идентификатор сообщения, на которое она отвечает (экземпляр New). Предположительно, это должно прийти через запрос, если у вас нет другого способа отслеживать это?
Что-то вроде:
def save_reply(request):
...
else:
form = ReplyForm()
form.reply_to = New.objects.get(id=request.REQUEST["post_id"])
Таким образом, вам нужно убедиться, что ссылка, которая вызывает отображение формы, содержит параметр 'post_id' (или аналогичный - возможно, у вас уже есть эквивалент, используемый для отображения рассматриваемого сообщения?).
Рядом с
widgets = {
'reply_to': forms.HiddenInput),
}
код это должен сделать форму, как вам нужно.
Идентификатор сообщения должен быть передан по всей цепочке
--post_id-> Render Post --post_id-> Render Ответить Форма --post_id-> Store Ответить