У меня есть общий CreateView
, который отображает модель и родственную модель ForeignKey как форму с встроенными линиями. Использование подобной модели с аналогичной моделью ForeignKey в качестве источника - как я могу предварительно заполнить исходную форму и получить только правильное количество строк в зависимости от объекта из источника?Как предварительно заполнить форму и связанные с ней строки с помощью значений объекта другой модели?
Ближайший я получил решение, используя CreatWithInlinesView
от django-extra-views, который дает мне пустую форму со связанной моделью в виде строк. Но как я могу получить данные из существующего объекта другой модели в эту форму с соответствующим количеством строк, необходимых объекту?
models.py
class Offers(models.Model):
reference = models.CharField(unique=True, max_length=10)
user = models.ForeignKey(User)
…
class OfferDetail(models.Model):
offer = models.ForeignKey(Offers, related_name='offerdetails')
product_name = models.CharField(max_length=255)
…
# where the data for prefilling comes from:
class Orders(models.Model):
reference = models.CharField(unique=True, max_length=10)
…
class OrderDetail(models.Model):
order = models.ForeignKey(Orders, related_name=‘orderdetails')
product_name = models.CharField(max_length=255)
…
urls.py
url(r'^offer/(?P<reference>[A-Z]{9})/$', views.MyOfferView.as_view(), name=‘somename’),
Теперь, если пользователь посещает URL offer/REFERENCE
он должен видеть форму, которая создает предложение, но предварительно заполненные от объекта порядка, имеет ссылку REFERENCE
без предварительно заполненных данных от объекта заказа он работает следующим образом (используя django-extra-views) views.py
from extra_views import CreateWithInlinesView, InlineFormSet
class DetailsInline(InlineFormSet):
model = OfferDetail
class MyOfferView(CreateWithInlinesView):
model = Offers
inlines = [DetailsInline, ]
template_name = ‘someapp/somename.html'
success_url = ‘/someurl’
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(MyOfferView, self).dispatch(*args, **kwargs)
somename.html
<form action="" method="post">
{% csrf_token %}
{{ form|crispy }}
{% for i in inlines %}
{{ i|crispy }}
{% endfor %}
<input type="submit" value="Submit" class="btn btn-primary"/>
</form>