每个用户 Django 一个模型对象



我不想扩展我的用户配置文件。

我用姓名、联系人和电子邮件制作了一个新模型。

问题 :

使用 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)

如@vorujack所述,您需要在user_info和用户模型之间创建一对一关系。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 约定。

在记录>接口并主要用作可调用对象的情况下,可以改用函数的命名约定。

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

所以你的课程应该真正UserInfoUserInfoCreate

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

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

谢谢 vorujack 和 e4c5。

仅仅通过做一对一字段并不能解决整个问题。

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

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

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')

最新更新