Предварительное заполнение формы модели на основе 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
  • Как создать экземпляр ModelForm Django с предварительно заполненными обязательными полями?
  • Установить начальное значение в форме модели Django


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

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