Django 3.0: Невозможно получить имя пользователя в шаблоне - PullRequest
0 голосов
/ 06 мая 2020

У меня проблема в том, что в шаблоне я автоматически получаю доступ к имени пользователя суперпользователя (если он вошел в систему), но не к имени пользователя пользователя на основе покупателя (модели). Пользователь регистрируется и также может войти в систему (я вижу это в базе данных). Но в шаблоне я не могу получить имя пользователя, отличное от суперпользователя. Я не понимаю, что мне здесь не хватает. Поэтому я помещаю сюда весь код view.py. Также после входа пользователя он видит bookrepo: home, и я использую logi пользователя c в заголовке. html (bookrepo: home расширяет заголовок. html)

У меня есть модель с именем Buyer in файл models.py. И на основе этой модели было изготовлено две модели Form.

Это код 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',)

Это код заголовка . html (НЕ дом. 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', {})

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Вы пытаетесь расширить свою пользовательскую структуру django с помощью поля One To One. новая расширенная 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")     
0 голосов
/ 07 мая 2020

Вы должны использовать {{ buyer.user.username }} в своем шаблоне, чтобы отображать имя пользователя.

...