0

基本上,我试图通过使用 OneToOne 模型来获取当前用户类型,您可以在下面看到并显示每个模型特定的不同模板“部分”。我研究了一下,发现了 type() 和 hasattr()。我想知道是否有任何方法可以在模板中使用它们,或者您有更好的建议吗?谢谢!

模型.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

视图.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)
4

1 回答 1

0

这是因为您有两种不同的模型。我在这里考虑的事情是制作一个模型并这样做:

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类,在我看来,这是扩展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 %}它将检查该值是否存在。在我看来,这有点脏,但它会起作用。 注意:如果值为空(没有名称的企业),它将返回 false。

views.py如果您需要第二种形式的示例,请告诉我。希望这可以帮助。玩得开心!:)

PS我会替换这个:

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

于 2016-10-02T16:47:38.413 回答