2017-09-13 11 views
0

私はdjangoモデルに送信して保存したいhtml形式を持っています。私がメッセージを送信しようとすると、私はエラーを取得する:私のhtmlフォームをdjangoモデルに投稿して保存するには?

ValueError at /account/userinfo/akylson/ 
"<Mail: hhh>" needs to have a value for field "id" before this many-to-many relationship can be used. 
Request Method: POST 
Request URL: http://localhost:8000/account/userinfo/akylson/ 
Django Version: 1.11.3 
Exception Type: ValueError 
Exception Value:  
"<Mail: hhh>" needs to have a value for field "id" before this many-to-many relationship can be used. 

あなたは以下の私のコードを見ることができます。

は、ここに以下の私のHTMLフォームれる: -

<form role="form" class="form-horizontal" method="post"> 
 
{% csrf_token %} 
 
    <div class="form-group"> 
 
    <input type="checkbox" id="id_receiver" name="receiver" value="{{ user.username }}" checked hidden> 
 
    <label class="col-lg-2 control-label">Тема</label> 
 
    <div class="col-lg-10"> 
 
    <input type="text" placeholder="" id="id_subject" name="subject" value="{{ subject }}" class="form-control"> 
 
    </div> 
 
    </div> 
 
    <div class="form-group"> 
 
    <label class="col-lg-2 control-label">Сообщение</label> 
 
    <div class="col-lg-10"> 
 
     <textarea rows="10" cols="30" class="form-control" id="id_message" name="message"></textarea> 
 
    </div> 
 
    </div> 
 
    <div class="form-group"> 
 
    <div class="col-lg-offset-2 col-lg-10"> 
 
     <span class="btn green fileinput-button"><i class="fa fa-plus fa fa-white"></i> 
 
     <span>Приложение</span><input type="file" name="files[]" multiple=""></span> 
 
     <button class="btn btn-send" value="submit" type="submit">Send</button> 
 
    </div> 
 
    </div> 
 
</form>

は、ここに私のview.py次のとおりです。ここで

@login_required() 
def userinfo(request, username): 
    username = User.objects.get(username=username) 
    args = {} 
    args['user'] = username 
    if request.method == 'POST': 
     sender = request.user 
     receiver = request.POST['receiver'] 
     subject = request.POST['subject'] 
     message = request.POST['message'] 
     b = Mail.objects.create(sender=sender, receiver=receiver, subject=subject, message=message) 
     b.save() 
    return render(request, 'account/userinfo.html', args) 

は私models.pyです:

class Mail(models.Model): 
    sender = models.ForeignKey(User, related_name='mail_sender') 
    receiver = models.ManyToManyField(User, related_name='mail_receiver') 
    subject = models.CharField(max_length=200) 
    message = RichTextUploadingField() 
    date = models.DateTimeField(auto_now=True, null=False, blank=False) 

    class Meta(): 
     ordering = ['-date'] 

    def __str__(self): 
     return self.subject 

H EREは私のforms.pyです:

class NewMailForm(forms.ModelForm): 
    class Meta: 
     model = Mail 

     fields = (
      'sender', 
      'receiver', 
      'subject', 
      'message', 
     ) 
     widgets = {'receiver': forms.CheckboxSelectMultiple()} 
+0

あなたが達成しようとしていますか? –

+0

ちょっと..上記のようにフォームに 'action'属性を追加してください。 –

+0

プライベートメッセージをFacebookやメールで書くことはできますか?あなたの助けが必要です。私はその問題に固執しています。あなたは私に電子メール([email protected])またはskype me(asankhodzhoev)を送るか、FacebookのKanat Asankhodzhoevで私を見つけることができます。 – Akylson

答えて

0

あなたのviews.pyuserインスタンスを渡す必要があります。

下記に示すように、

views.pyをごviews.pyを変更

@login_required() 
def userinfo(request): 
    user = request.user 
    form = NewMailForm(request.POST or None) 
    if request.method == 'POST': 
     if not form.is_valid(): 
      print form.errors 
      return render(request,'') 
     else: 
     sender = user 
     receiver = form.cleaned_data.get("receiver") 
     subject = form.cleaned_data.get("subject") 
     message = form.cleaned_data.get("message") 
     b = Mail.objects.create_user(
       sender=sender, 
       receiver=receiver, 
       subject=subject, 
       message=message) 
     b.save() 
    return render(request, 'account/userinfo.html') 

forms.py

<form action="." method="POST">{% csrf_token %} 

{{ form.as_p }} 

</form> 

これは、要求されたユーザーに新しいメールオブジェクトを作成します。あなたのviews.pyで

+0

私はそのコードを試しました。残念ながらそれは動作しません。 – Akylson

0

() 次いで、例えばインスタンスを使用してフィールドの各々をポスト m.receiver = request.POST.get(「受信」)例えば、M =メールのためのモデル のインスタンスを作成しますMany2manyフィールドは、Djangoは関係(この場合は、あなたのMail)モデルの反対側にあるレコードのIDを必要とリンクすることができます前に、 はその後 m.save()

+0

私はそれを試みたが動作しません。 – Akylson

0

で保存します。

だから、実際にこのように受信機を設定する前に、それを作成する必要があります。

b = Mail.objects.create(sender=sender, subject=subject, message=message) 

b.receiver = receiver 
b.save() 
関連する問題