Создать количество полей на основе выбора - PullRequest
0 голосов
/ 28 октября 2019

* Я пытаюсь выяснить, как заполнять поля в моей модели на основе предыдущего выбора полей.

Например, если FIELD_CHOICES = 3

Создать3x TextField ()

class Post(models.Model):
    STATUS_CHOICES = (('published','Published'),
                        ('draft','Draft '))
    FIELD_CHOICES = (('1','1 Title and body field'),
                    ('2','2 Title and body fields'),
                    ('3','3 Title and body fields'),
                    ('4', '4 Title and body fields'),
                    ('5', '5 Title and body fields'))

    author = models.ForeignKey(User,
                                on_delete=models.CASCADE,
                                related_name='blog_post')


    title = models.CharField(max_length=100)
    sub_title = models.TextField(max_length=50,default="")
    title_and_body_fields = models.IntegerField(choices=FIELD_CHOICES,
                                                default=1)

    **/// create number of title and body Textfields based on what was 
    /// selected in title_and_body_fields**


    created = models.DateField()
    publish = models.DateTimeField(default=timezone.now)
    slug = models.SlugField(max_length=250,
                            unique_for_date='created')

    status = models.CharField(max_length=250,
                    choices=STATUS_CHOICES,
                    default='draft')

    object = models.Manager()
    postManager = PostManager()


    class Meta():
        ordering = ('publish',)

    def __strd__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('my_blog:post_detail',
                        args=[self.publish.year,
                                self.publish.month,
                                self.publish.day,
                                self.slug])

В конце я решил сделать следующее.

Я добавил 5 отдельных TextFields для заголовка и тела и добавил пробел = True

title_5 = models.CharField(max_length=100,null=True,blank=True)
    title_5_body = models.TextField(null=True,blank=True)

1 Ответ

1 голос
/ 28 октября 2019

Боюсь, это невозможно.

Я думаю, вы неправильно понимаете, как работают Модели. Посмотрите документы Django для моделей здесь .

По сути, Django сохраняет ваши модели через ORM ( Object-Relational-Mapping) .

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

В документации для моделей вы можете увидеть этот фрагмент кода:

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

преобразуется в этот SQL запрос:

CREATE TABLE myapp_person (
    "id" serial NOT NULL PRIMARY KEY,
    "first_name" varchar(30) NOT NULL,
    "last_name" varchar(30) NOT NULL
);

Это означает, что Django под капотом создает таблицы базы данных для каждой имеющейся у вас модели. ваше приложение.


Так как же работает в Django?

Хорошо, эти операторы SQL генерируются при запуске python manage.py makemigrations. Фактические таблицы создаются при запуске python manage.py migrate.

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


Так почему я не могу добавить дополнительные TextFields к объекту?

Это потому, что для каждой модели в базе данных есть только одна таблица, и ваша модельбудет храниться так:

id   |   first_name   |  last_name 
----------------------------------
1    |   John         |  Doe
2    |   Jane         |  Doe
...  |   ...          |  ...   

Если бы вы добавили дополнительное поле (например, phone_number) к Джону Доу, вам нужно было бы добавить это поле ко всей таблице.

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


Хорошо, что теперь?

Ну, есть несколько способов сделать это. Лучше всего было бы создать отношение ManyToMany к модели, которая называется что-то вроде PostBody, что позволило бы вам создать произвольное количество тел для заданного сообщения.

Вы можете изменить свой метод сохраненияPost модель для автоматического создания установленного количества PostBody объектов для этого объекта.

Подробнее о ManyToManyField можно прочитать здесь .

...