自动在modelform中填充隐藏的表单字段

时间:2020-07-06 02:18:25

标签: django

因此,我的模型,表单和视图都可以正常工作。查看作品并发送电子邮件作品。 “邮件”已保存,但是我无法保存message_to和message_from。应该保存用户名。我可以保存所有内容,但是不能使用to和from用户名将消息保存到数据库中。我正在尝试在消息中仅包含1个字段。 “内容”。 to和from应该被隐藏并自动填充。我对此表示赞赏。谢谢。

'models.py'

    class Message(models.Model):
        message_content = models.TextField()
        message_to = models.ForeignKey(User, on_delete=models.CASCADE, related_name='message_to')
        message_from = models.ForeignKey(User, on_delete=models.CASCADE, related_name='message_from')
        date_created = models.DateTimeField(default=timezone.now)
        unread = models.BooleanField(default=True)

'forms.py'

    class MessageSellerForm(forms.ModelForm):
        class Meta:
            model = Message

'views.py'

    def ad_detail(request, *args, **kwargs):
template_name = 'x_ads/ad_detail.html'
ad = get_object_or_404(Ad, pk=kwargs['pk'])

ad.increment_view_count()

if request.method == 'POST':
    message_form = MessageSellerForm(data=request.POST)

    message_form.message_from = request.user.username
    message_form.message_to = ad.creator.username

    if message_form.is_valid():

        subject = 'Message about your ad. ' + ad.title
        from_email = request.user.email
        to_email = ad.creator.email
        message = 'You have a message about one of your ads waiting for you!'
        send_mail(subject=subject, message=message, from_email=from_email,
                  recipient_list=[to_email], fail_silently=False)

        messages.success(request, your message has been sent.')

        message_form.save()

        return HttpResponseRedirect(request.path_info)

else:
    message_form = MessageSellerForm()

return render(request, template_name, {'ad': ad, 'message_form': message_form})

1 个答案:

答案 0 :(得分:0)

我想我知道您正在尝试做什么,但是我认为还有其他方法会更容易一些。

https://docs.djangoproject.com/en/3.0/topics/forms/modelforms/#the-save-method

您可以改为:

# create the django object in memory, but don't save to the database
message = message_form.save(commit=False)
message.message_from = request.user.username
message.message_to = ad.creator.username
# now save it to the database
message.save()

如果您这样做,则不需要进一步分配消息表格:

message_form.message_from = request.user.username
message_form.message_to = ad.creator.username

编辑

您可能还需要修改MessageSellerForm,使其不包含message_frommessage_to字段,以便验证有效。可以,因为您知道在表单验证之后但保存到数据库之前,将为这些字段分配正确的值。