每个用户Django一个模型对象

时间:2018-08-18 02:33:39

标签: python django django-models django-views

我不想扩展我的用户个人资料。

我用名称,联系人和电子邮件创建了一个新模型。

问题:

使用createview,用户可以创建user_info模型的多个实例。

我们是否有可能限制用户仅创建一个user_info并每次进行更新。

models.py

class user_info(models.Model):
    booked_by = models.CharField(max_length=100)
    Name = models.CharField(max_length=40)
    contact = models.IntegerField()
    email = models.EmailField()

views.py

class user_info_create(LoginRequiredMixin,CreateView):
    login_url = 'Mel:user_login'
    form_class = user_infoform
    template_name = 'Mel/user_info_form.html'

    def form_valid(self, form):
        form.instance.booked_by = self.request.user
        return super(user_info_create, self).form_valid(form)



class user_info_detail(LoginRequiredMixin,DetailView):
    login_url = 'Mel:user_login'
    model = user_info
    context_object_name = "book"

    def get_queryset(self):
        return user_info.objects.filter(booked_by=self.request.user)

3 个答案:

答案 0 :(得分:2)

如@vorujack所述,您需要在user_info与用户模型之间创建OneToOne关系。 R和RDBMS代表“关系”。因此,您需要在模型之间建立关系。目前,您的系统在用户和个人资料之间没有任何关系。但是,正确的语法是

booked_by = models.OneToOneField(User)

那你需要做

python manage.py makemigrations
python manage.py migrate

如果表中已经有重复的条目,则第二步将失败。在这种情况下,您需要清除重复项并再次运行。如果该表中的条目无效,则迁移仍将失败。因此,如果您没有任何关键数据,那么实际上您可能想要清除整个表。

另一点值得注意。 https://legacy.python.org/dev/peps/pep-0008/#id39

  

类名   类名通常应使用CapWords约定。

     

在记录> interface并将其主要用作可调用对象的情况下,可以代替使用函数的命名约定。

     

请注意,内置名称有一个单独的约定:大多数内置名称是单个单词(或两个单词一起运行),而CapWords约定仅用于异常名称和内置常量。

因此,您的课程应该确实是UserInfoUserInfoCreate

答案 1 :(得分:1)

您可以像这样与您的用户模型建立联系:

class user_info(models.Model):
    booked_by = models.OneToOneField(User)
    Name = models.CharField(max_length=40)
    contact = models.IntegerField()
    email = models.EmailField()

与当前用户一起创建视图集booked_by字段。进行此更改后,如果用户要创建多个user_info,则会引发异常并且未插入任何user_info

答案 2 :(得分:0)

谢谢vorujack和e4c5。

仅通过OneToOneField并不能解决整个问题。

以下代码确实解决了我的问题。

如果它不正确或可以通过更好的方法完成,请告诉我。

model.py

booked_by = models.OneToOneField(User)

views.py

class user_RedirectView(LoginRequiredMixin,RedirectView):
        def get_redirect_url(self):
             if user_info.objects.filter(booked_by=self.request.user).exists():
                  return reverse('Mel:user_update')
             else:
                  return reverse('Mel:user_info_create')