Django: показать содержимое модели в соответствии с текущим пользователем, вошедшим в систему

#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. Мне действительно понравилось ваше объяснение, и ваш код помог мне.