Система ответов блогов 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 Ответить

Другие вопросы по тегам