我不想扩展我的用户个人资料。
我用名称,联系人和电子邮件创建了一个新模型。
问题:
使用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)
答案 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约定仅用于异常名称和内置常量。
因此,您的课程应该确实是UserInfo
和UserInfoCreate
答案 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')