У меня есть два 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
(я думаю) предполагает черный набор данных.Я не могу понять, почему я получаю другой результат - где это будет установлено / изменено?