Система ответов блогов Django - PullRequest
2 голосов
/ 27 мая 2010

Я пытаюсь создать мини-систему ответов, основанную на сообщениях пользователя в мини-блоге. В каждом сообщении есть ссылка с именем ответа. если кто-то нажимает на ответ, появляется форма ответа, а один редактирует ответ и отправляет форму. Проблема в том, что я не знаю, как получить идентификатор сообщения, на которое я хочу ответить. В представлении, если я использую в качестве параметра один номер (как идентификатор сообщения в блоге), он вставляет ответ в базу данных. Но как я могу сделать это, не жестко кодируя?

Вид:

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))  

у меня есть в форм.пи:

  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 ]

3 голосов
/ 29 мая 2010

Привет. Я решил проблему, используя ваши советы, но я создал другой. Я думал, что, поскольку форма ответа находится на другой странице, простое нажатие на эту ссылку ответа не поможет мне в любом случае сохранить идентификатор записи, потому что страница блога исчезла после того, как я нажму кнопку ответа. Итак, на мой взгляд, я создал функцию, которая содержит идентификатор сообщения в блоге в качестве параметра. Сохраняет так, как должно, без проблем, но теперь моя проблема: КАК МОЖЕТ ПРОЙТИ ССЫЛКУ, КАК

    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/ (например) конечно, я удалил свое поле внешнего ключа, так как теперь оно не нужно

Спасибо!

1 голос
/ 28 мая 2010

если нажать кнопку, появится форма ответа,

Я думаю, что это та часть, над которой нужно работать. Когда форма ответа обрабатывается, ей нужно иметь идентификатор сообщения, на которое она отвечает (экземпляр 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-> Отображать сообщение --post_id-> Отображать форму ответа --post_id-> Хранить ответ

1 голос
/ 28 мая 2010

Вам необходимо иметь скрытое поле в форме, чтобы захватить 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

Кстати, вы могли бы подумать об изменении названия вашей New модели на что-то вроде Post. «Новое» немного сложно говорить и немного сбивает с толку, так как «новое» обычно означает нечто совершенно иное в контексте программирования.

...