Я пытаюсь настроить разные модели в django.
Некоторые из моих моделей включают поля для текста. Текст определяется: - CharField (текс) - CharField (размер шрифта) - CharField (вес шрифта) - CharField (цвет)
Так что некоторым моим моделям требуется от одного до n таких текстов.
Можно ли создать коллекцию полей, например «Test-Collection», включающую все 4 поля. Чтобы мне не приходилось вручную писать все 4 поля для каждого текста, который мне нужен в модели?
Что-то такое:
class Box(CMSPlugin):
text1 = models.CharField(max_length=100)
text1_font_weight = models.CharField(max_length=100)
text1_font_size = models.CharField(max_length=100)
text1_color = models.CharField(max_length=100)
text2 = models.CharField(max_length=100)
text2_font_weight = models.CharField(max_length=100)
text2_font_size = models.CharField(max_length=100)
text2_color = models.CharField(max_length=100)
text3 = models.CharField(max_length=100)
text3_font_weight = models.CharField(max_length=100)
text3_font_size = models.CharField(max_length=100)
text3_color = models.CharField(max_length=100)
В это:
class Box(CMSPlugin):
text1 = TextColelction...
text2 = TextColelction...
text3 = TextColelction...






Возможно, лучше определить отдельную модель для текста и иметь отношение ForeignKey к Box. Например:
class Text(models.Model):
text = models.CharField(max_length=100)
text_font_weight = models.CharField(max_length=100)
text_font_size = models.CharField(max_length=100)
text_color = models.CharField(max_length=100)
class Box(..):
text1 = models.ForeignKey(Text)
text2 = models.ForeignKey(Text)
text3 = models.ForeignKey(Text)
@Flo Я добавил раздел обновлений, пожалуйста, посмотрите.
Это происходит так, как мне нравится ... но довольно неудобно, что я не могу создавать тексты внутри "нового экрана окна"
извините, я не понял, что вы имеете в виду под новый экран коробки? это другая модель?
В панели администратора, если я создаю новую модель коробки, я хотел бы, чтобы текст «форма» был вложен в поле «форма».
@Flo Я добавил встроенные связанные коды, с помощью которых вы можете добавлять текст на новую страницу окна
нет возможности сохранить отношения на родительском или?
извините, я не поняла. Что вы имеете в виду под relationship on parent or?
Обычно текст хранит идентификатор из поля ... я бы хотел, чтобы идентификатор текста сохранялся в поле
зачем вам это нужно? потому что вы можете получить доступ к текстам (объекты Text) из окна (объект Box) и получить идентификатор текстов из окна.
Так что я могу повторно использовать текстовый объект и в других моделях
Что именно вы имеете в виду под повторным использованием в других моделях?
Хорошо, я думаю, что мне нужно описать это подробнее: у меня есть разные модели, в которые нужно встроить один или несколько «текстов». Чтобы я мог использовать одну и ту же текстовую модель для Box-element, Container-Element и некоторых других ...
Ах. В этом случае вы можете сделать тексты независимыми и иметь отношение «многие ко многим». Я обновлю код в ближайшее время
Но почему это ManyToMany? Что такое OneToOne?
у вас не может быть один к одному, потому что OneToOne означает, что одно поле может быть связано только с одним текстом, но вам может потребоваться как минимум четыре текста
Да, но я хотел бы хранить каждое «отношение» в одном атрибуте! Я хотел бы иметь атрибут text1, text2 и text3 в Box, а не список текстов, а в контейнере я хотел бы иметь text1 и text2, но не третий
Теперь я получаю следующую ошибку: «Текст» не имеет внешнего ключа для «Коробки». Если я использую "InlineAdmin"
Вы не можете использовать встроенного администратора. Работает только для обратной связи
Это так раздражает ... но очень-очень-очень большое СПАСИБО за вашу поддержку!
Думаю, тебе это тоже не нужно. Вы можете напрямую добавить текст или создать его из окна администратора. Примите этот ответ, если он вам поможет
Добавление текстов с помощью cms (как дочерние элементы) для меня не сработает ... потому что text1 должен отображаться в другом div, а не в text2
@Flo не уверен, что вы спрашиваете, но вы можете изучить это: stackoverflow.com/questions/11056844/… о рендеринге ForeignKey в шаблоне. Но, тем не менее, ваш последний комментарий не входит в этот круг вопросов. Я надеюсь, что вы подтвердите мой вклад, приняв этот ответ с учетом текущего объема работ. Если вам нужна дополнительная помощь, задайте другой вопрос. Мы с радостью Вам поможем.
Позвольте нам продолжить обсуждение в чате.
Я не уверен, чего вы хотите достичь. Похоже, вы могли бы упростить эту модель до этого
from django.db import models
class TextCollection(models.Model):
text = models.CharField(max_length=100)
text_font_weight = models.CharField(max_length=100)
text_font_size = models.CharField(max_length=100)
text_color = models.CharField(max_length=100)
box = models.ForeignKey("Box", on_delete=models.CASCADE, related_name = "textcollections")
class Box(CMSPlugin):
pass
Таким образом, вы можете использовать столько TextCollections, сколько хотите в Box. Если вам также нужен текст в нескольких полях, вы можете использовать ManyToManyField вместо ForeignKey. https://docs.djangoproject.com/en/2.1/topics/db/examples/many_to_many/
Спасибо за Ваш ответ! Но чем, если я хочу включить этот текст в несколько других классов?