【问题标题】:Django - saving data from form in databaseDjango - 将表单中的数据保存在数据库中
【发布时间】:2016-08-09 02:52:16
【问题描述】:

我刚刚完成了一个电子邮件注册表单的 Django 教程,我正在尝试调整代码的某些部分以满足我的需求(在注册表单中添加一个附加字段)

根据教程,我创建了一个电子邮件注册模型表单:

class JoinForm(forms.ModelForm):
    class Meta:
        model = Join
        fields = ["email","wunschrad"]

我通过添加 wunschrad 字段对其进行了一些更改

然后我更新了我的模型以包含 wunschrad 并将数据库与 south 同步,一切正常。在我的模型下面:

class Join(models.Model):
    email = models.EmailField()
    wunschrad = models.CharField(max_length=120)
    friend = models.ForeignKey("self", related_name='referral', null=True, blank=True)
    ref_id = models.CharField(max_length=120, default='ABC', unique=True)
    ip_address = models.CharField(max_length=120, default='ABC')
    timestamp = models.DateTimeField(auto_now_add = True, auto_now = False)
    updated = models.DateTimeField(auto_now_add = False, auto_now = True)

    def __unicode__(self):
        return "%s" % (self.email)

    class Meta:
        unique_together = ("email", "ref_id",)

我遇到的问题是如何采用我的观点来反映这种变化。这是我所做的(我的更改在 cmets 中突出显示)

def home(request):
    try:
        join_id = request.session['join_id_ref']
        obj = Join.objects.get(id=join_id)
    except:
        obj = None

    form = JoinForm(request.POST or None)
    if form.is_valid():
        new_join = form.save(commit=False)
        email = form.cleaned_data['email']
        wunschrad = form.cleaned_data['wunschrad'] #I ADDED THIS
        new_join_old, created = Join.objects.get_or_create(email=email, wunschrad=wunschrad) # I ADDED WUNSCHRAD HERE
        if created:
            new_join_old.ref_id = get_ref_id()
            if not obj == None:
                new_join_old.friend = obj
            new_join_old.ip_address = get_ip(request)
            new_join_old.save()

        return HttpResponseRedirect("/%s" %(new_join_old.ref_id))


    context = {"form": form}
    template = "home.html"
    return render(request, template, context)

我的问题/问题如下:此代码 sn-p 有效,但如果用户使用相同的电子邮件地址注册并选择一次 wunschrad 的第一个选项,第二次选择第二个选项(澄清:wunschrad 是带有两个选项的下拉列表)Django 在数据库中保存两个版本,如下所示:Django Admin Screenshot

有谁知道如何更改代码以使每个用户只保存一次?

非常感谢您的帮助!

【问题讨论】:

    标签: python django django-models django-forms django-views


    【解决方案1】:

    所以你的问题是通过将 wunschrad 添加到 get_or_create 你告诉 Django 在数据库中查找具有这两个值的条目,而不仅仅是电子邮件。将其更改为此应该可以解决它:

    new_join_old, created = Join.objects.get_or_create(email=email)
    new_join_old.wunschrad = wunschrad
    new_join_old.save()
    

    这将确保它仅在电子邮件尚未在数据库中时创建一个新对象。

    作为旁注,如果您希望您的电子邮件是唯一的,并且如果您尝试使用相同的电子邮件保存另一个条目会引发错误,请将 unique=True 添加到 models.EmailField() 中,例如:

    models.EmailField(unique=True)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-16
      • 1970-01-01
      • 2017-03-06
      • 2021-04-26
      • 2020-10-07
      • 1970-01-01
      • 2016-10-15
      相关资源
      最近更新 更多