Django - показывать пользователю объект, соответствующий текущему URL - PullRequest
0 голосов
/ 25 февраля 2019

извинения за вводящее в заблуждение название;скажем, у меня есть такая ссылка:

<div class="col-md-3">
       <a class="btn btn-success" href="{% url 'rental-create' car.pk %}">Order this car!</a>
</div>

, которая ведет к представлению, которое я использую для обработки заказа своих автомобилей

class RentalCreateView(LoginRequiredMixin, SuccessMessageMixin, CreateView):
    form_class = RentalCreateForm
    template_name = 'rentals/rental_create.html'
    success_message = 'Created'
    context_object_name = 'order'

    def get_success_url(self):
        return reverse('rental-detail', kwargs={'pk': self.object.pk})

    def form_valid(self, form):
        form.instance.profile = self.request.user.profile
        car = Car.objects.get(pk=self.kwargs['pk'])
        form.instance.car = car
        return super().form_valid(form)

, теперь я хотел бы просто использовать свой объект (автомобиль) рк в шаблоне или непосредственно в форме, которую я определил выше.

Как видите, мне удалось получить доступ к этой переменной в моем методе form_valid:

car = Car.objects.get(pk=self.kwargs['pk'])

однако этот механизм гарантирует, что после сохранения экземпляра в базе данных car будет таким же, как в запрашиваемом URL.

Моя точка зрения заключается в использовании объекта car (который соответствует URL-адресу, например / rental / new / 1 / )в шаблоне или в виде поля, недоступного для редактирования.

вкратце - я бы хотел показать пользователю текущий автомобиль, который он заказывает.

вот мой файл forms.py

class RentalCreateForm(ModelForm):
    class Meta:
        model = Rental
        fields = ('start_date', 'end_date', 'additional_info',)
        exclude = ('profile', 'paid')
        widgets = {
            'start_date': DateInput(),
            'end_date': DateInput()
        }

Предоставляет ли Django простой способ добиться этого?Любая помощь будет высоко оценен.

1 Ответ

0 голосов
/ 25 февраля 2019

Вы можете добавить дополнительный контекст в методе get_context_data.

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['car'] = get_object_or_404(Car, pk=self.kwargs['pk']
    return context

Обратите внимание, что я использовал get_object_or_404, так что вы получите страницу 404, когда автомобиль не существует.Если вы используете get(), то исключение CarDoesNotExist приведет к ошибке сервера 500.

Теперь вы можете получить доступ к {{ car }} в шаблоне.

...