簡體   English   中英

如何將我的 html 表單發布到 django 模型並保存?

[英]How to post my html form to django model and save it?

我有我想發送並保存到 django 模型的 html 表單。 當我嘗試發送消息時,出現錯誤:

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

這是我的forms.py

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

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

您必須將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>

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

在您的 views.py 中創建模型的一個實例,例如 m = Mail() 然后使用實例發布每個字段,例如 m.receiver = request.POST.get('receiver') 然后用 m.save( )

在可以鏈接Many2many字段之前,Django 需要關系(在本例中為您的Mail )模型另一側的記錄的 id。

所以你必須在像這樣設置接收器之前實際創建它:

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

b.receiver = receiver
b.save()

你犯了幾個錯誤:

  1. 如果你做了一個HTML表單,並鏈接到項目forms.py不是必需的。

  2. 你還沒有定義 b。 剛寫完b.save

只需調試這些錯誤,就大功告成了!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM