Как создать новую (несохраненную) модель Django с ассоциациями? - PullRequest
1 голос
/ 04 марта 2011

Я встраиваю функцию «предварительного просмотра» в CMS для моего веб-сайта, которая использует существующий интерфейсный шаблон для визуализации модели. Эта модель имеет ассоциацию:

class FeatureWork(models.Model):
    name = models.CharField(max_length=100)
    ...

class FeatureWorkLink(models.Model):
    feature_work = models.ForeignKey(FeatureWork)

В представлении для предварительного просмотра я пытаюсь построить модель так, чтобы при вызове шаблона feature.featureworklink_set.all он возвращал связанные ссылки. Поскольку ни одна модель еще не была сохранена, все стандартные методы форм Django, похоже, выходят за рамки.

Это то, что я имею до сих пор, но оно взрывается, когда я вызываю метод add в менеджере, так как родитель еще не был сохранен:

form = FeatureWorkAdminForm(initial=request.POST)
featured = form.save(commit=False)
for link in request.POST['links'].split(","):
    featured.featureworklink_set.add(FeatureWorkLink(image=link))

Ответы [ 3 ]

0 голосов
/ 05 марта 2011

featured.featureworklink_set.add(FeatureWorkLink(image=link)) немедленно попытается создать связь между FeatureWork и FeatureWorkLink, что не произойдет, потому что этот экземпляр FeatureWork отсутствует в базе данных, и вы не можете удовлетворить предикаты дляпостроение отношений внешнего ключа.

Но замечательно, что экземпляры Django Model и ModelForm не будут проверять отношения внешнего ключа до тех пор, пока вы фактически не попытаетесь зафиксировать данные.Поэтому ручное построение вашего FeaturedWorkLink с некоммитированным, несуществующим FeatureWork должно удовлетворять любому представлению данных, которые вам нужно сделать, во многом так, как вы ожидаете:

 links = []
 form = FeatureWorkAdminForm(initial=request.POST)
 featured = form.save(commit=False)

 for link in request.POST['links'].split(","):
      links.add(FeatureWorkLink(image=link, feature_work=featured))

 # then somewhere in your templates, from the context

 {% for link in links %}
      <img src="{{ link.image }}" 
       title="Image for the featured work: '{{ link.feature_work.name }}'" />
 {% endfor %}

Так, в основном, во времяВ ходе сбора данных для создания FeatureWork вам придется поддерживать экземпляры FeatureWorkLink посредством последующих запросов.Здесь вы будете использовать набор форм модели, но предоставите незафиксированное FeatureWork для свойства feature_work для каждого экземпляра формы модели набора, вплоть до момента, когда все данные были собраны, где вы затем предоставляетепереданный FeatureWork экземпляр, так что набор форм модели может удовлетворить ссылочную целостность и, наконец, быть переданным в базу данных.

0 голосов
/ 05 марта 2011

Почему бы вам просто не добавить:

preview = BooleanField ()

в ваши модели, сохранить все в базе данных и не искать взломы.Таким образом, вы можете получить черновики бесплатно.

0 голосов
/ 05 марта 2011

Вы можете сохранить его в транзакции и откатить, когда шаблон будет готов. Это не очень эффективно, но, по крайней мере, будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...