Как создать объекты модели через представленную форму

Как создать объекты модели через представленную форму. Например, вот модель:-

class <-->(models.Model):
    Name = models.CharField(max_length=122)
    Student_Code = models.CharField(max_length=122)
    E_Mail = models.CharField(max_length=122)
    Password = models.CharField(max_length=122)
    Date = models.DateField()
    Time = models.CharField(max_length=122, default=None)
    def __str__(self):
        return str(self.Date)

Я хочу создать новый класс модели, в котором я хочу изменить <--> на желаемое имя из views.py.

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

В вашем случае, похоже, это можно решить с помощью отношения "многие к одному". Вот как это можно сделать:

Допустим, у вас есть модель с именем Student (угадано из вашего примера)


class Student(models.Model):
    name = models.CharField(max_length=122)
    student_code = models.CharField(max_length=122)
    email = models.CharField(max_length=122)
    password = models.CharField(max_length=122)
    date = models.DateField()
    time = models.CharField(max_length=122, default=None, null=True, blank=True)
    
    def __str__(self):
        return str(self.date)

И мы хотим разделить их на различные категории (скажем, студенты-математики и студенты CS), чтобы мы могли запрашивать только студентов CS.

Первым подходом может быть установка для них нового поля, которое говорит, к какой категории они принадлежат:


class Category(models.TextChoices):
    MATH = "math", "Math"
    CS = "cs", "Computer Science"


class Student(models.Model):
    category = models.CharField(max_length=32, choices=Category.choices)

    name = models.CharField(max_length=122)
    student_code = models.CharField(max_length=122)
    email = models.CharField(max_length=122)
    password = models.CharField(max_length=122)
    date = models.DateField()
    time = models.CharField(max_length=122, default=None, null=True, blank=True)
    
    def __str__(self):
        return str(self.date)

Теперь мы можем получить только студентов CS, используя:

cs_students = Student.objects.filter(category=Category.CS).all()

Но вам этого недостаточно, поскольку вы хотите создавать их динамически с помощью представления. Поэтому давайте преобразуем это в отношение "многие к одному":


class Category(models.Model):
    name = models.CharField(max_length=32)
    
    def __str__(self):
        return self.name


class Student(models.Model):
    category = models.ForeignKey(Category, on_delete=models.CASCADE)

    name = models.CharField(max_length=122)
    student_code = models.CharField(max_length=122)
    email = models.CharField(max_length=122)
    password = models.CharField(max_length=122)
    date = models.DateField()
    time = models.CharField(max_length=122, default=None, null=True, blank=True)
    
    def __str__(self):
        return str(self.date)

Теперь мы можем получить только студентов CS, используя:

cs_students = Student.objects.filter(category__name="cs").all()

Но можно также создавать новые категории с помощью:

physics = Category.objects.create(name="physics")

Теперь вы можете добавить новое представление Create View для Category и сможете создавать новые типы студентов и запрашивать их отдельно.

class CategoryCreateView(CreateView):
    model = Category
    fields = ('name',)

ВАЖНОЕ ПРИМЕЧАНИЕ

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

Я предлагаю вам взглянуть на Abstract User Model и использовать ее в качестве основы для вашей модели.

class Student(AbstractUser):
    name = models.CharField(max_length=122)
    student_code = models.CharField(max_length=122)

    USERNAME_FIELD = 'name'

Это позаботится о сохранении пароля за вас.

Вернуться на верх