Django 3.0: 无法在模板中获取用户名

问题描述 投票:0回答:1

我的问题是,在模板中,我自动获得超级用户的用户名(如果该用户已登录),但没有获得基于买方(模型)的用户的用户名。用户正在注册,也可以登录(我可以在数据库中看到它),但在模板中,我无法获得其他用户的用户名(如果该用户已经登录)。但在模板中,我无法获得超级用户以外的用户的用户名。我不知道我缺少什么。所以我把view.py的所有代码放在这里。另外,当用户登录后,他看到bookrepo:home,我在header.html中使用了用户逻辑(bookrepo:home扩展了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个回答
0
投票

你应该使用 {{ buyer.user.username }} 在你的模板中显示一个用户的用户名.你正试图用一个一比一字段来扩展你的django用户框架。


0
投票

你正在尝试扩展你的django用户框架与一比一字段.新扩展的Django模型用于存储与用户模型相关的额外信息。{{user.username}}给出了session中的用户名。

使用这段代码来验证用户的身份,不要忘了导入。

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")     
© www.soinside.com 2019 - 2024. All rights reserved.