2016-08-03 2 views
1

После отправки ModelForm, как я могу добавить отношение внешнего ключа так, чтобы оно проверялось?django добавить значение внешнего ключа после формы submit

models.py

class Comment(models.Model): 
    id = models.AutoField(primary_key=True) 
    activity = models.ForeignKey(Activity) 
    submitter = models.ForeignKey(User) 

    creation_date = models.DateTimeField(auto_now_add=True) 
    content = models.TextField() 

forms.py

class CommentForm(forms.ModelForm): 
    content = forms.CharField(widget=forms.Textarea) 

    class Meta: 
     model = Comment 

views.py

def index(request, id=None): 
    activity_instance = Activity.objects.get(pk=1) 
    submitter_instance = User.objects.get(id=1) 

    newComment = CommentForm(request.POST) 
    newComment.activity = activity_instance 
    newComment.submitter = submitter_instance 

    if newComment.is_valid():  # <-- false, which is the problem 

ответ

5

Я думаю, что вы путаете экземпляр формы с экземпляром модели. ваш newComment - это форма, назначающая другие объекты в качестве атрибута формы, не будет сохранять форму внешнего ключа (не уверен, где вы нашли это использование), потому что все данные формы сохраняются в form.data, что является подобной структуре данных.

Я не уверен, как выглядит ваша форма, потому что вы не исключили внешние ключи, чтобы они отображались как выпадающие списки, и вы могли бы выбрать их. Если вы не хотите, чтобы пользователь, чтобы выбрать внешний ключ, но выбрать для присвоения значения, как вы сейчас делаете, вы должны исключить их в виде так form.is_valid() будет проходить:

class CommentForm(forms.ModelForm): 
    content = forms.CharField(widget=forms.Textarea) 

    class Meta: 
     model = Comment 
     exclude = ('activity', 'submitter') 

views.py

def index(request, id=None): 
    activity_instance = Activity.objects.get(pk=1) 
    submitter_instance = User.objects.get(id=1) 

    comment_form = CommentForm(request.POST) 
    if comment_form.is_valid(): 
     new_comment = comment_form.save(commit=False) 
     new_comment.activity = activity_instance 
     new_comment.submitter = submitter_instance 
     new_comment.save() 

Django doc about save() method.

+0

Спасибо, очень ясно и полезно. – smilebomb

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