Предварительное заполнение формы модели на основе URL-адресаPython

Программы на Python
Ответить
Anonymous
 Предварительное заполнение формы модели на основе URL-адреса

Сообщение Anonymous »

Я не могу разобраться с формой Django. Мне не очень нравится эта часть структуры.
Вот случай. У меня есть ModelForm, содержащий OneToOneField. Я хотел бы предварительно заполнить поле ModelChoice объектом, указанным в URL-адресе. Пример: каталог/локация/добавить/7, чтобы добавить местоположение к продукту с pk=7
Примечание: если ПК не включен, форма просто не заполняется предварительно

Код: Выделить всё

models.py

Код: Выделить всё

class Product(models.Model):
pass

class ProductLocation(geo_models.Model):
product = geo_models.OneToOneField(Product, verbose_name=_('Product'), on_delete=geo_models.CASCADE, null=True,)
geo_point = geo_models.PointField(verbose_name=_('Location'), blank=True)
address = geo_models.CharField(verbose_name=_('Address'), max_length=255)

Код: Выделить всё

urls += [
re_path(r"^location/add/(?P\d+)/$",
self.add_update_location.as_view(),
name='catalogue-product-location-add'),  # Prepopulate product ModelChoiceField

path("location/add",
self.add_update_location.as_view(),
name='catalogue-location-create'  # Empty product ModelChoiceField
),

path("location/",
self.add_update_location.as_view(),
name='catalogue-location-update')  # Edit an existing Location
]

Код: Выделить всё

views.py

Код: Выделить всё

class LocationCreateUpdateView(generic.UpdateView):
form_class = ProductLocationForm

creating = True
product = None

def get_object(self, queryset=None):
"""
Extend the role of get_object to retrieve the product specified in the url
"""
self.creating = "pk" not in self.kwargs
if self.creating:
if self.kwargs.get("product_pk"):
self.product = get_object_or_404(Product, pk=self.kwargs["product_pk"])
return None
else:
return super().get_object(queryset)

# Try this way
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
if self.product and not self.request.POST.get('product'):
kwargs["product"] = self.product
return kwargs

# Or this way
def get_initial(self):
initial = super().get_initial()
if self.product:
initial["product"] = self.product
return initial

Код: Выделить всё

forms.py

Код: Выделить всё

class ProductLocationForm(forms.ModelForm):
def __init__(self, product=None, instance=None, *args, **kwargs):
# I tried this
if not instance and product:
instance = ProductLocation(product=product)
super().__init__(instance=instance, *args, **kwargs)
Я пытался переопределить get_initial(), чтобы передать продукт в форму, не прошел проверку, попросил выбрать продукт в списке и, более того, удалил начальное значение .
Я также использую get_form_kwargs(), чтобы передать продукт в функцию инициализации формы, и пытаюсь:
  • прикрепите продукт к ProductLocation экземпляр
  • установить исходные данные в init
  • set self.fidels['product'].initial = product
Спасибо за помощь
PS: некоторые ссылки на SO
  • Передача начального значения в форму модели в django
  • Как создать экземпляр Форма модели Django с предварительно заполненными обязательными полями?
  • Установить начальное значение в форме модели Django


Подробнее здесь: https://stackoverflow.com/questions/786 ... sed-on-url
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»