Python 将Django模型基于表单的系统转换为原始的基于HTML的表单系统,以便注册
我有一个基于类的视图系统,用于注册Python 将Django模型基于表单的系统转换为原始的基于HTML的表单系统,以便注册,python,html,django,Python,Html,Django,我有一个基于类的视图系统,用于注册Django,它使用Django的模型表单。但是我需要呈现我的自定义构建HTML表单来代替它 My型号.py: from django.contrib.auth.models import AbstractUser from django.db import models class User(AbstractUser): is_student = models.BooleanField(default=False) is_teacher =
Django
,它使用Django的模型表单。但是我需要呈现我的自定义构建HTML
表单来代替它
My型号.py:
from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
is_student = models.BooleanField(default=False)
is_teacher = models.BooleanField(default=False)
class Student(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
quizzes = models.ManyToManyField(Quiz, through='TakenQuiz')
interests = models.ManyToManyField(Subject, related_name='interested_students')
class StudentSignUpView(CreateView):
model = User
form_class = StudentSignUpForm
template_name = 'registration/signup_form.html'
def get_context_data(self, **kwargs):
kwargs['user_type'] = 'student'
return super().get_context_data(**kwargs)
def form_valid(self, form):
user = form.save()
login(self.request, user)
return redirect('students:quiz_list')
class StudentSignUpForm(UserCreationForm):
interests = forms.ModelMultipleChoiceField(
queryset=Subject.objects.all(),
widget=forms.CheckboxSelectMultiple,
required=True
)
class Meta(UserCreationForm.Meta):
model = User
@transaction.atomic
def save(self):
user = super().save(commit=False)
user.is_student = True
user.save()
student = Student.objects.create(user=user)
student.interests.add(*self.cleaned_data.get('interests'))
return user
和视图。py:
from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
is_student = models.BooleanField(default=False)
is_teacher = models.BooleanField(default=False)
class Student(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
quizzes = models.ManyToManyField(Quiz, through='TakenQuiz')
interests = models.ManyToManyField(Subject, related_name='interested_students')
class StudentSignUpView(CreateView):
model = User
form_class = StudentSignUpForm
template_name = 'registration/signup_form.html'
def get_context_data(self, **kwargs):
kwargs['user_type'] = 'student'
return super().get_context_data(**kwargs)
def form_valid(self, form):
user = form.save()
login(self.request, user)
return redirect('students:quiz_list')
class StudentSignUpForm(UserCreationForm):
interests = forms.ModelMultipleChoiceField(
queryset=Subject.objects.all(),
widget=forms.CheckboxSelectMultiple,
required=True
)
class Meta(UserCreationForm.Meta):
model = User
@transaction.atomic
def save(self):
user = super().save(commit=False)
user.is_student = True
user.save()
student = Student.objects.create(user=user)
student.interests.add(*self.cleaned_data.get('interests'))
return user
该系统还有一个form.py,它完成了艰苦的工作并呈现了Django
模型表单。现在,我需要将这些类型的Django的默认模型表单替换为我的自定义构建HTML
表单,类似这样的表单。
如何使用以下类型的简单系统,从views.py
接收数据并创建用户
if request.method == 'POST':
this_username = request.POST['username']
this_password = request.POST['password']
this_otherKindofStuff = request.POST['otherKindofStuff']
Student_signup = Student.objects.create(name=this_name, password=this_password, otherKindofStuff=this_otherKindofStuff)
Student_signup.save()
当前表单.py:
from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
is_student = models.BooleanField(default=False)
is_teacher = models.BooleanField(default=False)
class Student(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
quizzes = models.ManyToManyField(Quiz, through='TakenQuiz')
interests = models.ManyToManyField(Subject, related_name='interested_students')
class StudentSignUpView(CreateView):
model = User
form_class = StudentSignUpForm
template_name = 'registration/signup_form.html'
def get_context_data(self, **kwargs):
kwargs['user_type'] = 'student'
return super().get_context_data(**kwargs)
def form_valid(self, form):
user = form.save()
login(self.request, user)
return redirect('students:quiz_list')
class StudentSignUpForm(UserCreationForm):
interests = forms.ModelMultipleChoiceField(
queryset=Subject.objects.all(),
widget=forms.CheckboxSelectMultiple,
required=True
)
class Meta(UserCreationForm.Meta):
model = User
@transaction.atomic
def save(self):
user = super().save(commit=False)
user.is_student = True
user.save()
student = Student.objects.create(user=user)
student.interests.add(*self.cleaned_data.get('interests'))
return user
我的HTML模板:
from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
is_student = models.BooleanField(default=False)
is_teacher = models.BooleanField(default=False)
class Student(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
quizzes = models.ManyToManyField(Quiz, through='TakenQuiz')
interests = models.ManyToManyField(Subject, related_name='interested_students')
class StudentSignUpView(CreateView):
model = User
form_class = StudentSignUpForm
template_name = 'registration/signup_form.html'
def get_context_data(self, **kwargs):
kwargs['user_type'] = 'student'
return super().get_context_data(**kwargs)
def form_valid(self, form):
user = form.save()
login(self.request, user)
return redirect('students:quiz_list')
class StudentSignUpForm(UserCreationForm):
interests = forms.ModelMultipleChoiceField(
queryset=Subject.objects.all(),
widget=forms.CheckboxSelectMultiple,
required=True
)
class Meta(UserCreationForm.Meta):
model = User
@transaction.atomic
def save(self):
user = super().save(commit=False)
user.is_student = True
user.save()
student = Student.objects.create(user=user)
student.interests.add(*self.cleaned_data.get('interests'))
return user
电子邮件地址
我们永远不会与其他人共享您的电子邮件。
密码
看看我
提交
根据您的评论:
我只是想建立我的自定义表单与HTML的这份工作
我从中了解到的是,您希望设计自己的HTML表单,并取消Django的默认呈现?但是能够利用Django的形式逻辑
如果是这种情况,您只需将表单数据收集到视图中,即可将自定义字段命名为与ModelForm
中相同的名称,或者干脆将form
命名为相同的名称。例如,如果您有如下表单:
来自django导入表单的
类MyForm(forms.Form):
field=forms.CharField()
field2=forms.IntegerField()
如果您已经创建了视图并将MyForm
实例传递给上下文数据,那么为该表单创建自定义HTML的方法如下:
...
{%csrf_令牌%}
领域
字段1
如果提交了上述表单,则POST
ed数据将绑定到MyForm
实例,您可以执行验证等操作,还可以通过访问MyForm
实例的errors dict或per字段在模板中显示错误
除此之外,您当然可以使用Django表单
另外,你可能有兴趣尝试一下。如果您正在为HTML使用引导,这将是一个极好的补充。显示当前的
forms.py
和模板codedited。。。。而且这个模板只有一个简单的jinja用于呈现Django的模型表单,所以你要做的是添加自定义样式或类,是吗?你能不能也在HTML模板中显示一个表单的片段?是的,我想要它。HTML模板也是通过一个代码段添加的。在这里,你可以说这个表单中没有自定义样式或类,但我稍后会添加它们。那么你能添加一个预期HTML输出的示例吗?非常感谢,这可能就是我想要的。我可以通过请求从views.py访问数据。POST['field']可能吗?是的。你可以。让我添加一个片段,说明将发布的数据绑定到表单后可以做些什么。