【问题标题】:Django 3.0: Unable to get username in templateDjango 3.0:无法在模板中获取用户名
【发布时间】:2020-05-06 20:54:45
【问题描述】:

我的问题是,在模板中,我自动获得超级用户用户名的访问权限(如果已登录),但不是基于买方(型号)的用户用户名。用户正在注册,也可以登录(我可以在数据库中看到它)。但在模板中,我无法获取超级用户以外的用户名。我不知道我在这里缺少什么。所以我把 view.py 的所有代码放在这里。同样在用户登录后,他看到 bookrepo:home 并且我在 header.html 中使用用户逻辑(bookrepo:home extends header.html)

我在 models.py 文件中有一个名为 Buyer 的模型。并且基于这个模型,做了两个modelForm。


这是model.py的代码

class Buyer(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
user = models.OneToOneField(User, on_delete=models.DO_NOTHING)

# additional attributes
contact = models.CharField('Contact #', max_length=16, unique=True, validators=[
    RegexValidator(
        regex=r'^\+?1?\d{9,15}$',
        message="Phone number (Up to 15 digits) must be entered in the format: '+923001234567'."
    ),
], )
devices = models.CharField('Devices', unique=False, max_length=115, blank=True)
picture = models.ImageField(upload_to=profile_pic_path, null=True,blank=True)

def __str__(self):
    return "{} {}".format(self.user.first_name, self.user.last_name)

class Meta:
    get_latest_by = '-user.date_joined'

这是modelForms的代码

class RegistrationForm(forms.ModelForm):

password = forms.CharField(widget=forms.PasswordInput())
confirm_password = forms.CharField(widget=forms.PasswordInput())

class Meta():
    model = User
    fields = ('username',
              'email',
              'password')
def clean(self):
    cleaned_data = super(RegistrationForm, self).clean()
    password = cleaned_data.get("password")
    confirm_password = cleaned_data.get("confirm_password")

    if password != confirm_password:
        raise forms.ValidationError(
            "Password and Confirm Password does not match"
        )
class RegistrationFormPlus(forms.ModelForm):

class Meta():
    model = Buyer
    fields = ('contact',)

这是 header.html 的代码(不是 home.html)

{% if user.is_authenticated %}
     <a class="nav-link" href="{% url 'bookrepo:logout' %}">Logout</a>
     <h2>Welcome {{ user.username }}!</h2>
{% else %}
     <a class="nav-link" href="{% url 'bookrepo:user_login' %}">Login</a>
{% endif %}

这是views.py的代码

def home(req):
bookz = Book.objects.order_by('title')
var = {'books': bookz, 'range': 10}
return render(req, 'bookrepo/home.html', context=var)

def registration(request):
    registered = False

    if request.method == 'POST':

        reg_form = RegistrationForm(data=request.POST)
        reg_form_plus = RegistrationFormPlus(data=request.POST)

        if reg_form.is_valid() and reg_form_plus.is_valid():
            user = reg_form.save()

            user.set_password(user.password)
            user.save()
            user_plus = reg_form_plus.save(commit=False)
            user_plus.user = user
            user_plus.save()

            registered = True
        else:
            print(reg_form.errors, reg_form_plus.errors)
            print("else 2 chala")
    else:
        reg_form = RegistrationForm()
        reg_form_plus = RegistrationFormPlus()

    return render(request, 'bookrepo/signup.html',
                  {'reg_form': reg_form,
                   'reg_form_plus': reg_form_plus,
                   'registered': registered
                   })

@login_required
def special(request):
    return HttpResponse("You are logged in. Nice!")

@login_required
def user_logout(request):
    logout(request)
    return HttpResponseRedirect(reverse('bookrepo:home'))

def user_login(request):
if request.method == 'POST':

    username = request.POST.get('username')
    password = request.POST.get('password')
    user = authenticate(username=username, password=password)
    if user:
        return HttpResponseRedirect(reverse('bookrepo:home'))
    else:
        print("Someone tried to login and failed.")
        print("They used username: {} and password: {}".format(username, password))
        return HttpResponse("Invalid login details supplied.")
else:
    return render(request, 'bookrepo/login.html', {})

【问题讨论】:

    标签: django django-models django-forms django-views django-templates


    【解决方案1】:

    您应该在模板中使用{{ buyer.user.username }} 来显示用户的用户名。

    【讨论】:

    • 您可以通过{{ buyer.user.username }} 或者如果它是一个表格,也许可以通过{{registration_form_plus_instance.instance.user.username }} 获得它
    • 它也不起作用。不,它不是一种形式。它是一个显示 header.html 的模板(包括导航栏和搜索面板)。这个 header.html 应该被所有其他模板扩展。
    【解决方案2】:

    您正在尝试使用一对一字段扩展您的 django 用户框架。新的扩展 Django 模型用于存储与用户模型相关的额外信息。 {{user.username}} 提供会话中的用户名。

    使用此代码验证用户不要忘记导入

    from django.contrib.auth.models import User,auth
    
    def login(request):
    
        if request.method == "POST": 
            username = request.POST['username']
            password = request.POST['password']
    
            user=auth.authenticate(username=username,password=password)
            if user is not None:
                auth.login(request,user)
                return redirect('index')
            else:
                messages.info(request,'invalid user')
                return redirect('login')  
        else:    
            return render(request,"login.html")     
    

    【讨论】:

    • 它不工作。首先,在分配之前引用了局部变量“buyer”。其次,AttributeError at / 'str' object 没有属性 'username' (buyername)。
    • 更改变量名称买家购买或任何变量名称并更改上下文字典 {'user':buy.user}
    • 仍然出现错误。 UnboundLocalError at / local variable 'buy' 在赋值之前引用。
    • 这个问题是因为你没有登录。所以添加 else condation **else:buy='not logined' **
    • 现在,错误:/'str' 对象的 AttributeError 没有属性 'user'。我从上下文字典 {'user':buyer.buyername} 中收到此错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2021-01-09
    • 2017-02-27
    • 2012-11-22
    • 2014-06-28
    • 2012-01-04
    相关资源
    最近更新 更多