#django #django-models
#django #django-модели
Вопрос:
Я хочу показать содержимое формы текущего пользователя, вошедшего в систему, как я могу этого добиться
models.py
class Sign(models.Model):
name = models.CharField(max_length=50)
regid = models.CharField(max_length=50)
email = models.EmailField(max_length=255)
designation = models.ForeignKey(Designation, default='', on_delete=models.CASCADE)
phone = models.IntegerField()
car_type = models.ForeignKey(Cars, default='', on_delete=models.CASCADE)
pick_up = models.CharField(max_length=50)
destination = models.CharField(max_length=50)
guestname = models.CharField(max_length=50, blank=True)
user = models.ForeignKey(User, default='', null=True, on_delete=models.CASCADE, related_name='hiuser')
class Meta:
db_table = "Sign"
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('final')
forms.py
class BookingForm(forms.ModelForm):
class Meta:
model = Sign
fields = ['name', 'designation', 'email', 'pick_up', 'regid', 'car_type', 'guestname', 'destination', 'phone', ]
widgets = {
'name': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Your Name'}),
'designation': forms.Select(attrs={'class': 'form-control' }),
'email': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Email Address'}),
'pick_up': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Pick Up Location'}),
'regid': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Registration ID'}),
'car_type': forms.Select(attrs={'class': 'form-control'}),
'guestname': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Guest Name(If Any)'}),
'destination': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Destination'}),
'phone': forms.NumberInput(attrs={'class': 'form-control', 'placeholder': 'Phone Number'}),
}
views.py
@login_required
def booking(request):
'''model = Sign
form = BookingForm'''
if request.method == 'POST':
form = BookingForm(request.POST)
if form.is_valid():
form.save()
messages.success(request, 'Your Booking is Accepted')
return redirect('final')
else:
form = BookingForm()
return render(request, 'datas/booking.html', {'form': form})
Это мой взгляд на создание формы, теперь я хочу показать это содержимое здесь:
@login_required
def final(request):
bookings = Sign.objects.filter(user=User.objects.get(username=request.user))
return render(request, 'datas/final.html', {'bookings': bookings})
final.html
{% extends 'datas/base.html' %}
{% block content %}
{% load static %}
<center><h1 style="color: steelblue">Your Booking</h1></center>
<br><br>
<table class="table table-striped table-bordered table-sm">
<thead class="thead-dark">
<tr>
<th>Username</th>
<th>Name</th>
<th>Registration ID</th>
<th>Designation</th>
<th>Phone</th>
<th>Email Address</th>
<th>Pick Up Location</th>
<th>Destination</th>
<th>Action</th>
</tr>
</thead>
<tbody>
{% if bookings %}
{% for booking in bookings %}
<tr>
<td>{{ booking.pk }}</td>
<td>{{ booking.name }}</td>
<td>{{ booking.regid }}</td>
<td>{{ booking.designation }}</td>
<td>{{ booking.phone}}</td>
<td>{{ booking.email }}</td>
<td>{{ booking.pick_up }}</td>
<td>{{ booking.destination }}</td>
<td>
<a href="{% url 'update' booking.pk %}" class="btn btn-success">Edit</a>
<a href="{% url 'delete' booking.pk %}" class="btn btn-success">Delete</a>
</td>
</tr>
{% endfor %}
{% endif %}
</tbody>
</table>
{% endblock %}
Как отобразить содержимое бронирования текущего пользователя, который вошел в систему? Должен ли я использовать общие представления? Также существуют ли какие-либо чистые и отличительные способы отображения содержимого final.html вместо того, чтобы использовать таблицу?
Спасибо!!
Ответ №1:
Если вы хотите получить данные, связанные с зарегистрированными пользователями, вы можете использовать related_name для извлечения данных, связанных с этим пользователем.
Поскольку вы указали related_name для «User» в «Sign» как «hiuser».
request.user.hiuser.all()
должен предоставить весь связанный с пользователем объект «Sign». В случае, если вы не указали связанное имя, вы могли бы использовать request.user.sign_set.all()
шаблон related_name по умолчанию является modelname_set
Таким образом, ваше представление становится:
#bookings = Sign.objects.filter(user=User.objects.get(username=request.user)) # instead of this
bookines = request.user.hiuser.all()
return render(request, 'datas/final.html', {'bookings': bookings})
Комментарии:
1. Мне помогли как ваши, так и @Willem коды. Так что спасибо вам обоим.
Ответ №2:
request.user
Атрибут является User
объектом, поэтому нет необходимости извлекать объект:
@login_required
def final(request):
bookings = Sign.objects.filter(user=request.user)
return render(request, 'datas/final.html', {'bookings': bookings})
В представлении, в котором вы добавляете элементы, вы должны связать request.user
с этим объектом:
@login_required
def booking(request):
'''model = Sign
form = BookingForm'''
if request.method == 'POST':
form = BookingForm(request.POST)
if form.is_valid():
form.instance.user = request.user
form.save()
messages.success(request, 'Your Booking is Accepted')
return redirect('final')
else:
form = BookingForm()
return render(request, 'datas/booking.html', {'form': form})
Примечание: обычно лучше использовать
settings.AUTH_USER_MODEL
[Django-doc] для ссылки на пользовательскую модель, чем использоватьUser
модель [Django-doc] напрямую. Для получения дополнительной информации вы можете увидеть ссылку наUser
модель раздела документации.
Комментарии:
1. Я изменил внешний ключ в подписи модели на настройки. AUTH_USER_MODEL и изменил код в соответствии с вашим предложением, но теперь таблица ничего не показывает.
2. @RinkumoniKhanikar: в вашей начальной таблице объекты, скорее всего, не были связаны с пользователем. Пожалуйста, проверьте базу данных. Вот почему
form.instance.user = request.user
связывает новый объект с зарегистрированным пользователем.3. Мне действительно понравилось ваше объяснение, и ваш код помог мне.