Как создать объекты модели через представленную форму
Как создать объекты модели через представленную форму. Например, вот модель:-
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'
Это позаботится о сохранении пароля за вас.