首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django-crispy-forms的替代方案

django-crispy-forms的替代方案
EN

Stack Overflow用户
提问于 2019-03-09 08:43:02
回答 1查看 2.3K关注 0票数 5

我正在用django 2.1开发一个应用程序,并使用bootstrap 4,它需要一个用于用户注册的表单。在我见过的大多数示例中,都显示了单列表单的示例,这对于一个只有几个字段的表单来说已经足够了,但是对于一个更复杂的表单来说,它会很难看,因为您必须滚动字段的数量。我想为它设计一个Server side类型的表单

调查了一下,我发现了这个教程Advanced Form Rendering with Django Crispy Forms,其中使用了Django Crispy Forms,你会得到你想要的形式。然而,我并不想使用它,所以试着手动完成它,并达到这个目的。我认为它可以改进一点,因为它不是很干净,但它是一个替代方案,可以达到与使用Django Crispy表单相同的结果。我认为这可以使用ajax完成,但到目前为止我从未使用过它。他还会问自己,如果有人已经这么做了,为什么要把做这件事变得复杂呢?这是一种在没有任何魔法的情况下理解一切工作原理的方法。

views.py

代码语言:javascript
复制
def sign_up(request):
if 'code_user' in request.session:
    return redirect('home')
elif request.method == 'POST':
    form = SignupForm(request.POST)
    if form.is_valid():
        user = form.save()
        request.session['code_user'] = user.code
        request.session['username'] = user.username
        return redirect('home')
    else:
        for field in form:
            if field.errors:
                form.fields[field.name].widget.attrs['class'] = 'form-control is-invalid'
        return render(request, 'blog/signup.html', {'form': form})

else:
    form = SignupForm()
    return render(request, 'blog/signup.html', {'form': form})

要指明哪些字段无效,您必须添加此类“is-invalid”,否则它将不起作用。

forms.py

代码语言:javascript
复制
class SignupForm(forms.ModelForm):

class Meta:
    model = User
    fields = ['username', 'email', 'password', 'first_name', 'last_name', 'age', 'gender', 'country']
    widgets = {
        'username': forms.TextInput(attrs={'class': 'form-control', }),
        'country': forms.Select(attrs={'class': 'form-control', }),
        'first_name': forms.TextInput(attrs={'class': 'form-control', }),
        'last_name': forms.TextInput(attrs={'class': 'form-control', }),
        'age': forms.DateInput(attrs={'class': 'form-control', 'type': 'date'}),
        'email': forms.EmailInput(attrs={'class': 'form-control', }),
        'password': forms.PasswordInput(attrs={'class': 'form-control', }),
        'gender': forms.Select(attrs={'class': 'form-control', }),
    }
    labels = {
        'username': _('Username'),
        'country': _('Country'),
        'first_name': _('First Name'),
        'last_name': _('Last Name'),
        'age': _('Birthdate'),
        'email': _('Email'),
        'password': _('Password'),
        'gender': _('Gender'),
    }
    error_messages = {
        'username': {
            'unique': _('The username is not available')
        },
        'first_name': {
            'required': _('The field can not be empty')
        },
        'last_name': {
            'required': _('The field can not be empty')
        },
        'password': {
            'required': _('The field can not be empty')
        }

    }

signup.html

代码语言:javascript
复制
    {% extends 'blog/base.html' %}

{% block content %}

 <div class="row justify-content-center" style="padding-top: 1rem">
     <div class="col-md-10">
         <div class="card">
             <div class="card-header text-center">Sign up</div>
             <div class="card-body">
                 <form method="POST">
                     {% csrf_token %}
                     <div class="form-row">
                         <div class="form-group col-md-4">
                             <label >{{ form.username.label }}</label>
                             {{ form.username }}
                             {% for error in form.username.errors %}
                                 <div class="invalid-feedback">{{ error }}</div>
                             {% endfor %}
                         </div>

                         <div class="form-group col-md-4">
                             <label>{{ form.first_name.label }}</label>
                             {{ form.first_name }}
                             {% for error in form.first_name.errors %}
                                 <div class="invalid-feedback">{{ error }}</div>
                             {% endfor %}
                         </div>

                         <div class="form-group col-md-4">
                             <label>{{ form.last_name.label }}</label>
                             {{ form.last_name }}
                             {% for error in form.last_name.errors %}
                                 <div class="invalid-feedback">{{ error }}</div>
                             {% endfor %}
                         </div>
                     </div>

                     <div class="form-row">
                         <div class="form-group col-md-4">
                             <label >{{ form.age.label }}</label>
                             {{ form.age }}
                             {% for error in form.age.errors %}
                                 <div class="invalid-feedback">{{ error }}</div>
                             {% endfor %}
                         </div>

                         <div class="form-group col-md-4">
                             <label >{{ form.gender.label }}</label>
                             {{ form.gender }}
                             {% for error in form.gender.errors %}
                                 <div class="invalid-feedback">{{ error }}</div>
                             {% endfor %}
                         </div>

                         <div class="form-group col-md-4">
                             <label >{{ form.country.label }}</label>
                             {{ form.country}}
                             {% for error in form.country.errors %}
                                 <div class="invalid-feedback">{{ error }}</div>
                             {% endfor %}
                         </div>
                     </div>

                     <div class="form-row">
                         <div class="form-group col-md-6">
                             <label >{{ form.email.label }}</label>
                             {{ form.email }}
                              {% for error in form.email.errors %}
                                 <div class="invalid-feedback">{{ error }}</div>
                             {% endfor %}
                         </div>

                         <div class="form-group col-md-6">
                             <label >{{ form.password.label }}</label>
                             {{ form.password }}
                              {% for error in form.password.errors %}
                                 <div class="invalid-feedback">{{ error }}</div>
                             {% endfor %}
                         </div>
                     </div>

                     <button type="submit" class="btn btn-primary">Sign in</button>
                 </form>
             </div>
         </div>
     </div>
 </div>

{% endblock %}

在模板中,我猜这就是所有东西都不那么干净的地方,因为太多的循环让我不知所措,我认为这并不是最优的。

EN

回答 1

Stack Overflow用户

发布于 2021-08-18 01:02:02

也许下面的帖子会有所帮助,它展示了如何使用django-floppyforms来更好地组织前端文件

Better usage of JS & CSS inside Django

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

https://stackoverflow.com/questions/55072876

复制
相关文章

相似问题

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