2010-05-27 3 views
2

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

Зрения:

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

отметить, что Новый является микро-блог класса

thanks 

ответ

3

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

url(r'^save_reply/(?P<id>\d+)/$', 
         save_reply, 
         name='save_reply'), 

(это то, что я держу в urls.py) на ответ по каждой должности? Я имею в виду, что до сих пор моя ответная ссылка просто вызывала функцию replies/save_reply (у меня был ответ), но теперь, когда у меня есть идентификатор в качестве параметра, как я могу поместить его в свой 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

Вам нужно иметь скрытое поле в вашей форме, чтобы захватить PK любого экземпляра New, к которому относится комментарий.

Поскольку вы используете ModelForm, ваша модель Reply уже установила отношения ForiegnKey. Вы можете установить тип widget быть скрыты, так что ваши пользователи не видят это ..

# 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. «Новый» немного сложно говорить и немного запутанно, поскольку «новый» обычно означает нечто совершенно иное в контексте программирования.

+0

hmm .. нет, это еще не решило мою проблему. – dana

+0

Можете ли вы обновить сообщение своим новым кодом? –

1

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

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

+1

Ах хороший момент. Я думал, что по форме ответа появляется форма, которая уже была отображена в текущем шаблоне, просто скрытая некоторым JS. Если форма ответа находится на другой странице, однако вам нужно будет вытащить post_id из запроса, как вы показали. –

+0

Я сделал так, как вы сказали, и на этот раз моя ошибка: KeyError at/replies/save_reply/ не должен ли я передавать в качестве параметра функцию reply_to? Но тогда, как ссылка для ответа, как я могу задать URL-адрес: r '^ profile_view/(? P \ d +)/$'? Я имею в виду href = 'what here'? Спасибо – dana

Смежные вопросы