Django UpdateView - нет объекта из-за вызова POST - PullRequest
0 голосов
/ 01 июня 2018

У меня есть два UpdateViews, один работает, а другой нет ... Пожалуйста, см. Обновление IV

Рабочая модель:

просмотров.py

class JuryUpdate(UpdateView):
    model = Jury
    fields = [
        'jury_name',
        ]
    template_name_suffix = '_update_form'

    def get_object(self, *args, **kwargs):
        return get_object_or_404(Jury, jury_id=self.kwargs['jr'])

    def form_valid(self, form):
        form.instance.customer_id = self.kwargs['pk']
        form.instance.court_year = self.kwargs['yr']
        form.instance.jury_id = self.kwargs['jr']
        return super(JuryUpdate, self).form_valid(form)

templates / jury_update_form.html (в соответствующей части)

<div class="container">
    <h5>Update {{for.instance.jury_name}}</h5>
    <form method="post">{% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="Save" />
    </form>
</div>

Эта настройка отобразит обновление с метками объектов исуществующие данные поля из объекта.Следующая настройка не работает ...

views.py

class CustomerUpdate(UpdateView):
    model = Customer
    fields = [
        'customer',
        ]
    template_name_suffix = '_update_form'

    def get_object(self, *args, **kwargs):
        return get_object_or_404(Customer, customer_id=self.kwargs['pk'])

    def form_valid(self, form):
        form.instance.customer_id = self.kwargs['pk']
        return super(CustomerUpdate, self).form_valid(form)

templates / customer_update_form.html (в соответствующей части)

<div class="container">
    <h5>Update {{form.instance.customer}}</h5>
    <form method="post">{% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="Save" />
    </form>
</div>

Второе обновление предоставляет форму обновления, но не заполняется данными вызывающего объекта.Может показаться, что объект существует, поскольку {{form.instance.customer}} содержит правильные customer данные для вызова (не отличающиеся от представления JuryUpdate).

Я пытался явно вызвать get_initial (какописал здесь ) и распечатал, но результат {}.Я также пробовал вариант вызова form_valid, но, как показано выше, я считаю, что получаю правильный объект.Есть несколько примеров (например, здесь ), которые используют get_initial для предварительного заполнения существующей информацией - но в этом случае это не работает и не требуется в моем представлении JuryUpdate.

Любая помощь приветствуется.

ОБНОВЛЕНИЕ I

models.py

class Customer(models.Model):

    class Meta:
        verbose_name = "Customer"
        verbose_name_plural = "Customers"

    customer_id = models.AutoField(
        primary_key=True)

    customer = models.CharField(
        max_length=40)

    # table fields

    def get_absolute_url(self):
        return reverse(
            'customer-detail-view', 
            kwargs={'pk':self.pk})

    def __str__(self):
        return self.customer

class Jury(models.Model):

    class Meta:
        verbose_name = "Jury"
        verbose_name_plural = "Juries"

    customer = models.ForeignKey(
        Customer,
        on_delete=models.CASCADE)

    court_year = models.ForeignKey(
        CourtYear,
        on_delete=models.CASCADE)

    jury_id = models.AutoField(
        primary_key=True)

    jury_name  = models.CharField(
        max_length=20)

    # other table fields

    def get_absolute_url(self):
        return reverse(
            'jury-list-view', 
            kwargs={'pk':self.customer_id, 'yr':self.court_year_id})

    def __str__(self):
        return self.jury_name

urls.py

path('add_customer/', views.CustomerCreate.as_view(), name='customer-add'),
path('<int:pk>/', views.CustomerDetailView.as_view(), name='customer-detail-view'),
path('<int:pk>/delete/', views.CustomerDelete.as_view(), name='customer-delete'),   
path('<int:pk>/update/', views.CustomerUpdate.as_view(), name='customer-update'),

path('<int:pk>/<int:yr>/', views.JuryListView.as_view(), name='jury-list-view'),
path('<int:pk>/<int:yr>/add_jury/', views.JuryCreate.as_view(), name='jury-add'),
path('<int:pk>/<int:yr>/<int:jr>/updatejury', views.JuryUpdate.as_view(), name='jury-update'),
path('<int:pk>/<int:yr>/<int:jr>/deletejury', views.JuryDelete.as_view(), name='jury-delete'),

ОБНОВЛЕНИЕ II

Я добавил get_initial() метод моего CustomerUpdate(UpdateView) следующим образом:

def get_initial(self):

    initial = super(CustomerUpdate, self).get_initial()
    print('initial data', initial)

    customer_object = self.get_object()

    initial['customer'] = customer_object.customer
    # other fields omitted...

    print('initial data updated', initial)

    return initial

Печать initial data возвращает {}.Печать initial data updated возвращает {'customer': 'John Doe'} (плюс «другие поля»).Таким образом, кажется, что правильная информация извлекается и доставляется - она ​​должна быть в html?

Обновление III

I 'мы взяли CustomerUpdate(UpdateView) до самой базовой модели класса:

class CustomerUpdate(UpdateView):
    model = Customer
    fields = [
        'customer',
        ]
    template_name_suffix = '_update_form'

Шаблон уже является базовым форматом ( docs ) - отображаемая веб-страница по-прежнему не содержит объектных данныхдля обновления ...

Обновление IV

Мне кажется, я понял проблему - но не знаю, как исправить ...

Когда я использую JuryUpdate вызов, консоль показывает:

[02/Jun/2018 16:19:19] "GET /myapp/1/3/9/updatejury/?csrfmiddlewaretoken=1kHK4xgqdbBfXsv6mtz0WKgKpewFwLVtpUX5Z51qnLsGaMDVmpdVHKslXAXPhvY8 HTTP/1.1" 200 3687

Когда я использую CustomerUpdate вызов, консоль показывает:

[02/Jun/2018 16:18:57] "POST /myapp/5/update/ HTTP/1.1" 200 3354

Так что мой обзор обновлений для жюри - это вызов GET, в то время как мой обзор udpate для Клиента - POST.Просматривая документы, я вижу, что вызов GET с показом данных, в то время как вызов POST (я думаю) предполагает черный набор данных.Я не могу понять, почему я получаю другой результат - где это будет установлено / изменено?

1 Ответ

0 голосов
/ 03 июня 2018

Через 3 дня - я проследил проблему - это не имело никакого отношения к представлению, модели, URL или шаблону обновления.Оскорбительный код был фактически прикреплен к кнопке обновления.В частности, страница, на которой была кнопка «Обновить», использовала следующий код <form>:

<form action="{% url 'customer-update' pk=customer.client_id %}" method="post" style="display: inline;">
    {% csrf_token %}
    <button type="submit" class="btn btn-outline-primary btn-custom-xs">U</button>
</form>

В вызове формы использовался метод "POST" - и хотя я не совсем понимаюВ результате в результате появится пустое окно UpdateView.Следующий код на странице вызова исправил проблему.

<form action="{% url 'customer-update' pk=customer.client_id %}" style="display: inline;">
    {% csrf_token %}
    <button type="submit" class="btn btn-outline-primary btn-custom-xs">U</button>
</form>
...