Как я могу получить доступ к текущему экземпляру моей модели в форме изменения администратора? - PullRequest
2 голосов
/ 22 мая 2019

Я пытаюсь создать систему управления данными для издателя, желающего отслеживать продажи.У меня есть модель для книжных магазинов, в которой хранятся книги издателя, которая включает в себя поле статуса (из модели статуса) для каждого магазина.Статус может быть что-то вроде «не установлено», «заказ получен» или «перезвонить».

В дополнение к возможности просмотра текущего статуса, клиент также хотел бы иметь возможность просмотра статусаизменения для данного магазина при проверке данных книжного магазина в форме изменения администратора: сам статус, дата и время изменения статуса, пользователь, который внес изменение, и некоторые комментарии об этом изменении.Поэтому я создал модель изменения статуса для хранения этих данных и добавил встроенный.

В форме изменения администратора для книжных магазинов я отключил поле статуса (чтобы пользователи не могли изменять статус без создания изменения статусазапись) и добавила ссылку «Изменить статус», которая переводит пользователей в форму, позволяющую им создавать новую запись об изменении статуса.Проблема, которую я не смог решить: как я могу получить доступ к текущему экземпляру книжного магазина, чтобы я мог передать идентификатор магазина и его текущий статус в форму изменения статуса?

Я могу получить идентификатор пользователябез проблем из запроса.Я могу получить идентификатор первого книжного магазина в моей базе данных с помощью self.model.objects.first (), но мне не удалось найти способ получения идентификатора книжного магазина, который просматривается при ссылке «Изменить статус»

В моделяхстатус ... первого книжного магазина в базе данных!

1 Ответ

0 голосов
/ 22 мая 2019

В настоящее время у вас есть путь для книжного магазина изменить что-то вроде:
/admin/<app_name>/bookstore/<pk>/change/
Я бы посоветовал вам сохранить эту конфигурацию URL и создать URL для смены статуса, например:
/admin/<app_name>/bookstore/<pk>/statuschange/

Предполагая, что StatusChangeForm:

class StatusChangeForm(forms.ModelForm):
    class Meta:
        model = models.StatusChange
        fields = ['user', 'bookstore', 'status',]

Таким образом, чтобы сделать это, вам необходимо настроить get_urls() для принятия pk из bookstore:

def get_urls(self):
        urls = super().get_urls()
        my_urls = [path('<int:pk>/statuschange/', self.change_store_status, name='statuschange'), ]
        return my_urls + urls

и измените ваш change_store_status() для получения этого pk и используйте его при получении bookstore instance:

def change_store_status(self, request, pk):
        obj = self.model.objects.get(pk=pk)

        store_id = getattr(obj, 'id')
        store_status = getattr(obj, 'status')
        form = forms.StatusChangeForm(request.POST or None,
            initial={'user': request.user, 'bookstore': store_id, 'status': store_status}
        )

        if request.method == 'POST':
            if form.is_valid():
                form.save()

        payload = {"form": form}
        return render(request, "admin/change_status.html", payload)

Также вы должны указать pk в шаблоне изменения в книжном магазине, чтобы направить пользователя на исправление формы, например:
{% url 'admin:statuschange' pk=original.pk %}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...