Django 1.10 - 每个 OneToOne 模型的不同模板
Django 1.10 - Different templates for each OneToOne model
基本上,我试图通过使用您在下面看到的 OneToOne 模型获取当前用户类型,并显示每个模型特定的不同模板 "parts"。我研究了一下,发现了 type() 和 hasattr()。我想知道是否有任何方法可以在模板中使用它们,或者您有更好的建议吗?谢谢!
models.py
class Type1(models.Model):
user = models.OneToOneField(User)
company_name = models.CharField(max_length=100)
def __unicode__(self):
return self.company_name
class Type2(models.Model):
user = models.OneToOneField(User)
first_name = models.CharField(max_length=30)
second_name = models.CharField(max_length=30)
def __unicode__(self):
return self.first_name
views.py
def Type1Registration(request):
if request.user.is_authenticated():
return HttpResponseRedirect('/')
if request.method == 'POST':
form = Type1Form(request.POST)
if form.is_valid():
user = User.objects.create_user(username=form.cleaned_data['username'],
email=form.cleaned_data['email'], password=form.cleaned_data['password'])
user.save()
type1 = Type1(user=user, company_name=form.cleaned_data['company_name'])
type1.save()
return HttpResponseRedirect('/')
else:
return render(request, 'type1_register.html', {'form': form})
else:
form = Type1Form()
context = {'form': form}
return render(request, 'type1_register.html', context)
def Type2Registration(request):
if request.user.is_authenticated():
return HttpResponseRedirect('/')
if request.method == 'POST':
form = Type2Form(request.POST)
if form.is_valid():
user = User.objects.create_user(username=form.cleaned_data['username'],
email=form.cleaned_data['email'], password=form.cleaned_data['password'])
user.save()
type2 = Type2(user=user, first_name=form.cleaned_data['first_name'],
second_name=form.cleaned_data['second_name'])
type2.save()
return HttpResponseRedirect('/')
else:
return render(request, 'type2_register.html', {'form': form})
else:
form = Type2Form()
context = {'form': form}
return render(request, 'type2_register.html', context)
这是因为您有两个不同的模型。我在这里考虑的事情是制作一个模型并这样做:
class UserComplete(AbstractUser):
first_name = models.CharField(max_length=30)
second_name = models.CharField(max_length=30)
company_name = models.CharField(max_length=100)
company = models.BooleanField(default=False)
def get_name(self):
"Returns the person's or business name."
if self.company:
return self.company_name
else:
return self.first_name
我在这里要提的一件事是我不完全确定你想用这些模型做什么,所以我不确定这是否真的是最适合你的解决方案。我还使用了 AbstractUser
,这是您可能不熟悉的东西。基本上,它扩展了 User
class,在我看来,这是扩展 User
模型的最佳方式。更多信息请点击此处:https://docs.djangoproject.com/en/1.10/topics/auth/customizing/#specifying-custom-user-model
那么你有两个选择。对于您的表单,您可以创建两个单独的表单或一个。同样,这取决于您要对模型做什么,以及如果必须更改某些内容,您希望在何处编辑内容。
这里有两种形式,如果你想那样做:
class UserCreateForm(UserCreationForm):
class Meta:
model = UserComplete
fields = ("email", "username", "password", "first_name", "second_name")
class BusinessCreateForm(UserCreationForm):
class Meta:
model = UserComplete
fields = ("email", "username", "password", "company_name")
或者只有一个:
class CreateForm(UserCreationForm):
company_name = forms.CharField(required=False)
first_name = forms.CharField(required=False)
second_name = forms.CharField(required=False)
class Meta:
model = UserComplete
fields = ("email", "username", "password", "company_name", "first_name", "second_name", "company")
您必须在模板中手动呈现表单,并且不要显示您不想要的表单。如果您需要更多相关信息,请阅读此处:https://docs.djangoproject.com/en/1.10/topics/forms/#rendering-fields-manually。使用第一个表单选项,您将必须分别处理每个表单,就像您在 views.py
中所做的那样。使用第二个选项,您可以呈现一个表单并使用 company
中的布尔值来确定需要处理哪些字段。
再一次,我想说这完全取决于您正在构建的内容。使用第二个选项,您可以在模板中执行类似 {% if request.user.company %}
的操作。您的原始代码没有该选项。虽然,有一个解决方法。您可以这样做: {% if request.user.type1.company_name %}
它将检查该值是否存在。在我看来,这有点脏,但它会起作用。
注意:如果该值为空(没有名称的企业),它将 return false。
如果您需要第二种形式的 views.py
示例,请告诉我。希望这可以帮助。玩得开心! :)
P.S。我会替换这个:
if request.user.is_authenticated():
return HttpResponseRedirect('/')
与login_required
。在这里阅读更多相关信息:https://docs.djangoproject.com/en/1.10/topics/auth/default/#django.contrib.auth.decorators.login_required
基本上,我试图通过使用您在下面看到的 OneToOne 模型获取当前用户类型,并显示每个模型特定的不同模板 "parts"。我研究了一下,发现了 type() 和 hasattr()。我想知道是否有任何方法可以在模板中使用它们,或者您有更好的建议吗?谢谢!
models.py
class Type1(models.Model):
user = models.OneToOneField(User)
company_name = models.CharField(max_length=100)
def __unicode__(self):
return self.company_name
class Type2(models.Model):
user = models.OneToOneField(User)
first_name = models.CharField(max_length=30)
second_name = models.CharField(max_length=30)
def __unicode__(self):
return self.first_name
views.py
def Type1Registration(request):
if request.user.is_authenticated():
return HttpResponseRedirect('/')
if request.method == 'POST':
form = Type1Form(request.POST)
if form.is_valid():
user = User.objects.create_user(username=form.cleaned_data['username'],
email=form.cleaned_data['email'], password=form.cleaned_data['password'])
user.save()
type1 = Type1(user=user, company_name=form.cleaned_data['company_name'])
type1.save()
return HttpResponseRedirect('/')
else:
return render(request, 'type1_register.html', {'form': form})
else:
form = Type1Form()
context = {'form': form}
return render(request, 'type1_register.html', context)
def Type2Registration(request):
if request.user.is_authenticated():
return HttpResponseRedirect('/')
if request.method == 'POST':
form = Type2Form(request.POST)
if form.is_valid():
user = User.objects.create_user(username=form.cleaned_data['username'],
email=form.cleaned_data['email'], password=form.cleaned_data['password'])
user.save()
type2 = Type2(user=user, first_name=form.cleaned_data['first_name'],
second_name=form.cleaned_data['second_name'])
type2.save()
return HttpResponseRedirect('/')
else:
return render(request, 'type2_register.html', {'form': form})
else:
form = Type2Form()
context = {'form': form}
return render(request, 'type2_register.html', context)
这是因为您有两个不同的模型。我在这里考虑的事情是制作一个模型并这样做:
class UserComplete(AbstractUser):
first_name = models.CharField(max_length=30)
second_name = models.CharField(max_length=30)
company_name = models.CharField(max_length=100)
company = models.BooleanField(default=False)
def get_name(self):
"Returns the person's or business name."
if self.company:
return self.company_name
else:
return self.first_name
我在这里要提的一件事是我不完全确定你想用这些模型做什么,所以我不确定这是否真的是最适合你的解决方案。我还使用了 AbstractUser
,这是您可能不熟悉的东西。基本上,它扩展了 User
class,在我看来,这是扩展 User
模型的最佳方式。更多信息请点击此处:https://docs.djangoproject.com/en/1.10/topics/auth/customizing/#specifying-custom-user-model
那么你有两个选择。对于您的表单,您可以创建两个单独的表单或一个。同样,这取决于您要对模型做什么,以及如果必须更改某些内容,您希望在何处编辑内容。
这里有两种形式,如果你想那样做:
class UserCreateForm(UserCreationForm):
class Meta:
model = UserComplete
fields = ("email", "username", "password", "first_name", "second_name")
class BusinessCreateForm(UserCreationForm):
class Meta:
model = UserComplete
fields = ("email", "username", "password", "company_name")
或者只有一个:
class CreateForm(UserCreationForm):
company_name = forms.CharField(required=False)
first_name = forms.CharField(required=False)
second_name = forms.CharField(required=False)
class Meta:
model = UserComplete
fields = ("email", "username", "password", "company_name", "first_name", "second_name", "company")
您必须在模板中手动呈现表单,并且不要显示您不想要的表单。如果您需要更多相关信息,请阅读此处:https://docs.djangoproject.com/en/1.10/topics/forms/#rendering-fields-manually。使用第一个表单选项,您将必须分别处理每个表单,就像您在 views.py
中所做的那样。使用第二个选项,您可以呈现一个表单并使用 company
中的布尔值来确定需要处理哪些字段。
再一次,我想说这完全取决于您正在构建的内容。使用第二个选项,您可以在模板中执行类似 {% if request.user.company %}
的操作。您的原始代码没有该选项。虽然,有一个解决方法。您可以这样做: {% if request.user.type1.company_name %}
它将检查该值是否存在。在我看来,这有点脏,但它会起作用。
注意:如果该值为空(没有名称的企业),它将 return false。
如果您需要第二种形式的 views.py
示例,请告诉我。希望这可以帮助。玩得开心! :)
P.S。我会替换这个:
if request.user.is_authenticated():
return HttpResponseRedirect('/')
与login_required
。在这里阅读更多相关信息:https://docs.djangoproject.com/en/1.10/topics/auth/default/#django.contrib.auth.decorators.login_required