Django я не могу сохранить форму с 2 внешними ключами - PullRequest
2 голосов
/ 27 мая 2010

у меня есть класс ответа:

class Reply(models.Model):
    reply_to = models.ForeignKey(New)
    creator = models.ForeignKey(User)
    reply = models.CharField(max_length=140,blank=False)

Форма воспроизведения:

class ReplyForm(ModelForm):
class Meta:
      model = Reply
      fields = ['reply']

где New - класс сообщений (содержащий сообщения пользователей) и вид

def save_reply(request):
   #u = New.objects.get(pk=id)
if request.method == 'POST':

    form = ReplyForm(request.POST)
    if form.is_valid():
       new_obj = form.save(commit=False)
       new_obj.creator = request.user
       new_obj.reply_to = form.reply_to
     #  reply_to_id = u
       new_post = New(2) #this works hardcoded, but how can i get the blog New post #id, as a parameter, instead?
       new_obj.reply_to = new_post
       new_obj.save()
       return HttpResponseRedirect('.')    

еще: form = ReplyForm ()
return render_to_response ('replies / replies.html', { «форма»: форма, }, context_instance = RequestContext (request))

где create_by принадлежит к новому классу и представляет создателя сообщения (на которое нужно ответить)

как я могу назначить текущее сообщение ответу под ним?

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 27 мая 2010

Возможно, я что-то пропустил, но reply_to нужен экземпляр Новой модели. New.id не похож на меня?

new_obj.reply_to = New.id

У вас есть экземпляр Новой модели, доступный на тот момент, который вы можете назначить?

ах, я вижу, вы подправили вопрос

Если у вас нет экземпляра Новой модели, вам нужно создать его

new_post = New(whatever, goes, here)
new_post.save()

Затем присвойте его reply_to

new_obj.reply_to = new_post

или аналогичный.

редактировать

Не зная точно, что ReplyForm выглядит так, как будто я немного догадываюсь, но, предположительно, оно основано на объекте Reply, позволяющем пользователю выбрать поле reply_to так или иначе?

Предполагая, что переменная response_to формы заполнена и корректна, я думаю, вы должны просто сделать:

form = ReplyForm(request.POST)
if form.is_valid():
   new_obj = form.save(commit=False)
   new_obj.creator = request.user
   new_obj.reply_to = form.reply_to
   new_obj.save()

На самом деле, поскольку это внешний ключ, new_obj = form.save(commit=False), возможно, уже установил .reply_to для вас? Могут помочь Django Model Forms документы.

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

Не уверен, подходит ли это для вашего приложения или нет, но вы можете попробовать использовать виджет формы , в частности, HiddenInput, чтобы включить пост (id) в форму. Что-то вроде

class ReplyForm(ModelForm):
    reply_to = forms.ModelChoiceField(New.objects.all(), widget=forms.HiddenField)
    class Meta:
        model = Reply
        fields = ['reply', 'reply_to']
        widgets = {
           'reply_to': HiddenField,
        }

(Не уверен, что это полностью правильно, но см. переопределение-по-типу-полей-типов-или-виджетов для более подробной информации.

Теперь вы включили идентификатор, который необходимо передать клиенту и обратно через форму, теперь вам просто нужно ввести его при создании формы для отображения в первую очередь

else: 
    form = ReplyForm()
    form.reply_to = # ... fill in the current post (New inst) being replied to
    # presumably from somewhere in the request object?
    return render_to_response('replies/replies.html', { 'form': form, }, 

Надеюсь, это не уведет вас с неверного пути - полностью не проверено, E & OE, YMMV и т. Д. И т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...