我有一个在Django中注册的基于类的视图系统,它使用Django的模型形式。但是我需要用我的自定义构建HTML表单来代替它。
我的models.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')和views.py
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')该系统还具有一个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()当前forms.py
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 模板
<body>
<div class="container">
<div class="jumbotron">
<form>
<div class="form-group">
<label for="exampleInputEmail1">Email address</label>
<input type="email" class="form-control" name="username" aria-describedby="emailHelp" placeholder="Enter email">
<small id="emailHelp" class="form-text text-muted">We'll never share your email with anyone else.</small>
</div>
<div class="form-group">
<label for="exampleInputPassword1">Password</label>
<input type="password" class="form-control" name="password" placeholder="Password">
</div>
<div class="form-check">
<input type="checkbox" class="form-check-input" id="exampleCheck1">
<label class="form-check-label" for="exampleCheck1">Check me out</label>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
</div>
</body>
<head>
<!-- media query support -->
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css">
<!-- jQuery library -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<!-- Popper JS -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
<!-- Latest compiled JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"></script>
</head>
发布于 2020-12-25 08:48:43
从你的评论:
我只想为这个工作用HTML构建我的自定义表单
我从中了解的是,您想要设计自己的HTML表单,并取消Django的默认呈现?但是能够利用Django的形式逻辑。
如果是这样的话,收集表单数据到视图中所需要的就是将您的自定义字段命名为与ModelForm或简单的Form中相同的名称。例如,如果您有如下表单:
from django import forms
class MyForm(forms.Form):
field = forms.CharField()
field2 = forms.IntegerField()当然,如果您已经创建了视图并将MyForm实例传递给上下文数据,那么您将如何为此表单创建自定义HTML:
...
<form method="post" action='.'>
{% csrf_token %}
<div class="my-custom-field-wrapper">
<label for="field">Field</label>
<input id="field" type="text" class="my-custom-field" />
</div>
<div class="my-custom-field-wrapper">
<label for="field1">Field 1</label>
<input id="field1" type="number" class="my-custom-field" />
</div>
<!-- buttons, etc -->
</form>如果上面的表单被提交,POSTed数据将绑定到MyForm实例,并且您可以执行验证等操作,并且还可以通过访问MyForm实例的错误dict或每个字段在模板中显示错误。
此外,您当然可以使用Django窗体的窗口小部件。
另外,您可能对尝试django-脆-形式感兴趣。如果您在HTML中使用引导程序,这将是一个很好的添加。
https://stackoverflow.com/questions/65445496
复制相似问题