首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Django模型表单系统转换为基于HTML的原始表单系统以供注册

将Django模型表单系统转换为基于HTML的原始表单系统以供注册
EN

Stack Overflow用户
提问于 2020-12-25 05:19:44
回答 1查看 433关注 0票数 0

我有一个在Django中注册的基于类的视图系统,它使用Django的模型形式。但是我需要用我的自定义构建HTML表单来代替它。

我的models.py

代码语言:javascript
复制
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

代码语言:javascript
复制
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接收数据并创建用户?

代码语言:javascript
复制
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

代码语言:javascript
复制
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 模板

代码语言:javascript
复制
<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>

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-25 08:48:43

从你的评论:

我只想为这个工作用HTML构建我的自定义表单

我从中了解的是,您想要设计自己的HTML表单,并取消Django的默认呈现?但是能够利用Django的形式逻辑。

如果是这样的话,收集表单数据到视图中所需要的就是将您的自定义字段命名为与ModelForm或简单的Form中相同的名称。例如,如果您有如下表单:

代码语言:javascript
复制
from django import forms
class MyForm(forms.Form):
   field = forms.CharField()
   field2 = forms.IntegerField()

当然,如果您已经创建了视图并将MyForm实例传递给上下文数据,那么您将如何为此表单创建自定义HTML:

代码语言:javascript
复制
...
<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中使用引导程序,这将是一个很好的添加。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65445496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档