#python #django #django-models #django-forms #django-views
#python #django #django-модели #django-формы #django-представления
Вопрос:
Я пытаюсь напечатать имя и название компании на панели навигации, но это ничего не выводит
base.html
<nav class="navbar navbar-expand-lg navbar-light bg-lightgrey">
<div class="collapse navbar-collapse" id="navbarNav">
{% if request.user.is_authenticated and request.user.is_student %}:
<ul class="navbar-nav mr-auto">
<li class="nav-item">
<a class="nav-link" href="{% url 'home' %}">Home<span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'jobs' %}">Jobs</a>
</li>
</ul>
<ul class="navbar-nav ml-auto">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
{{student.first_name}}
</a>
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="#">My Account</a>
<a class="dropdown-item" href="#">Change Password</a>
<a class="dropdown-item" href="{% url 'logout' %}">Logout</a>
</div>
</li>
</ul>
</ul>
{% elif request.user.is_authenticated and request.user.is_employer %}:
<ul class="navbar-nav mr-auto">
<li class="nav-item">
<a class="nav-link" href="{% url 'home' %}">Home<span class="sr-only(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Posts</a>
</li>
<li class="nav-item">
<a class="nav-link" href="jobs-create">Add Jobs</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Students</a>
</li>
</ul>
<ul class="navbar-nav ml-5">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
{{employer.company_name}}
</a>
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="#">My Account</a>
<a class="dropdown-item" href="#">Change Password</a>
<a class="dropdown-item" href="{% url 'logout' %}">Logout</a>
</div>
</li>
</ul>
</ul>
{% else %}:
<ul class="navbar-nav mr-auto">
<li class="nav-item">
<a class="nav-link" href="{% url 'home' %}">Home<span class="sr-only">(current)</span></a>
</li>
</ul>
<ul class="navbar-nav ml-auto">
<li class="nav-item">
<a class="nav-link" href="{% url 'login' %}">Login</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Register
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown" style="min-width: 3rem;">
<a class="dropdown-item" href="{% url 'employee-register' %}">Employee</a>
<a class="dropdown-item" href="{% url 'employer-register' %}">Employer</a>
</div>
</li>
</ul>
</ul>
{% endif %}
</div>
</nav>
model.py
class User(AbstractUser):
username = None
email = models.EmailField(unique=True, blank=False)
date_joined = models.DateTimeField(auto_now_add=True)
is_active = models.BooleanField(default=True)
is_student = models.BooleanField(default=False)
is_employer = models.BooleanField(default=False)
objects = UserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
class Student(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='student_profile', primary_key=True)
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
gender = models.CharField(max_length=10, choices=GENDER_CHOICES)
level = models.CharField(max_length=3, choices=LEVEL)
school = models.CharField(max_length=5, choices=SCHOOL)
major = models.CharField(max_length=40, default="")
cv = models.FileField(blank=True)
skills_or_trainings = models.TextField(default="")
def __str__(self):
return self.first_name ' ' self.last_name
class Employer(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='employer_profile', primary_key=True)
company_name = models.CharField(max_length=200, blank=False)
company_address = models.TextField()
website = models.CharField(unique=True, max_length=100, blank=False)
def __str__(self):
return self.company_name
form.py
class UserRegistrationForm(UserCreationForm):
class Meta:
model = User
fields = ['email']
def save(self, commit=True):
user = super().save(commit=False)
if commit:
user.save()
return user
class EmployeeRegistrationForm(forms.ModelForm):
first_name = forms.CharField(label='First Name')
last_name = forms.CharField(label='Last Name')
cv = forms.FileField(label='CV')
skills_or_trainings = forms.SlugField(label='Skills or Trainings', required=False, widget=forms.Textarea)
class Meta:
model = Student
fields = ['first_name', 'last_name', 'gender', 'level', 'school', 'major', 'cv', 'skills_or_trainings' ]
class EmployerRegistrationForm(forms.ModelForm):
company_name = forms.CharField(label="Company Name")
company_address = forms.CharField(label="Company Address")
website = forms.CharField()
class Meta:
model = Employer
fields = ['company_name', 'company_address', 'website']
Я не знаю, правильно ли я понимаю, или есть другой способ вызова полей модели на панели навигации. Если я использую {{ user.email }}, он распечатается, но если я использую {{ student.first_name }}, он ничего не распечатает
Комментарии:
1. Я знаю, что в Django есть поле first_name по умолчанию, но если я использую его, это будет полезно только для поля Student, а не для поля Employer, потому что мне нужно, чтобы название компании и адрес компании были меткой. Я не знаю, возможно ли изменить метку для модели работодателя, чтобы в качестве метки отображались название компании и адрес при использовании поля first_name по умолчанию и для моей модели Student
Ответ №1:
Использовать {{ user.student.first_name }}
Комментарии:
1. {{user.student.first_name}} все еще ничего не печатает
2. Затем попробуйте {{ request.user.first_name }} Вы должны понимать, что шаблоны django используют контекстные переменные, которые вы указали в своих представлениях. Не видя представлений, я ничего не могу сказать.
3. Я не использую поле first_name в Django по умолчанию. Мое поле first_name находится в моей модели Student, но оно ничего не выводит, когда я его вызываю
4. {{ request.user.first_name }} будет выводиться только тогда, когда я использую first_name, предоставленное пользовательской моделью Django по умолчанию
5. Ваш пользователь связан через поле «один к одному» с user, поэтому правильным способом будет {{ request.user.student.first_name }}