2017-09-13 98 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我(asankhodzhoev)或在Facebook上找到我Kanat Asankhodzhoev。 – Akylson

回答

0

你要通過user實例您views.py

更改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> 

這將創建的用戶一個新的郵件對象。

+0

我試過這個代碼。但不幸的是它沒有作用。 – Akylson

0

在你views.py創建例如M =郵件() 然後發佈每個使用實例例如場的模型 的實例 m.receiver = request.POST.get(「接收器」) 然後用 m.save()

+0

我試過了,它不起作用。 – Akylson

0

節省Many2many場之前可以鏈接Django的需要(在這種情況下,你Mail)模型在關係的另一側的記錄的ID。

所以,你必須設置接收這樣的前實際創建它:

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

b.receiver = receiver 
b.save() 
相關問題