包含两种模型的表单

时间:2014-12-09 05:44:33

标签: python django forms

我正在尝试在Django中创建一个模型表单。此表单包含first_name,last_name,email和contact_request的输入。

我有两种模式:

from django.db import models

class User(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    # phone_number =
    email = models.EmailField()

    def __str__(self):
        return self.first_name + " " + self.last_name

    class Meta:
        db_table = "home_users"


class ContactRequest(models.Model):
    user = models.ForeignKey(User)
    message = models.TextField(max_length=500)
    datetime_created = models.DateTimeField("Date/time created")

    class Meta:
        db_table = "home_contactrequests"

在我的表单中,提交后,由于UsersContactRequests之间存在OneToMany关系,因此在home_usershome_contactrequests时会添加一个新行是通过表单提交的新电子邮件。如果home_users表中存在该电子邮件,则只会将新行添加到home_contactrequests,其外键引用user.id

我现在还不太清楚如何实现这一点,因为我不熟悉模型和Django。我想知道是否有人可以指导我向我展示创建此类表单所涉及的过程和逻辑。

1 个答案:

答案 0 :(得分:1)

使用User模型上的get_or_create来提取用户,如果该用户已经存在该用户:

以下是您在视图中进行连线的一种方式:

def some_view(request):
    form = SomeForm(request.POST or None)
    if form.is_valid():
        obj, created = User.objects.get_or_create(email=form.cleaned_data['email'], 
                                                  first_name=form.cleaned_data['first_name'],
                                                  last_name=form.cleaned_data['last_name'])
        ContactRequest.objects.create(user=obj,
                                      message=form.cleaned_data['message'],
                                      datetime_created=datetime.datetime.now())
        return redirect('/thanks')
     return render(request, 'form.html', {'form': form})

您可以为datetime_created字段设置auto_now_add option来帮助自己;这样你的时间戳就会自动保存。