我不想扩展我的用户配置文件。
我用姓名、联系人和电子邮件制作了一个新模型。
问题 :
使用 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 约定仅用于异常名称和内置常量。
所以你的课程应该真正UserInfo
和UserInfoCreate
您可以像这样与用户模型建立关系:
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')