2017-09-13 102 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() 
相关问题