Bootstrap 按钮在 django 表单中显示不正确
Bootstrap button doesn't display properly in django form
编辑:刚刚意识到这个问题有多么臃肿,我的 html 格式多么糟糕。对不起,我在发帖前没注意到。现在正在修复它
因此,正如您可能在图像中看到的那样,我无法让 bootstrap 按钮正确显示在我的 Django 模板中。它旨在提交用户注册表,但如您所见,我已尝试将其放在几个地方以查看容器是否影响它:Bootstrap buttons as they appear in my project
当然,它应该是这样的:
enter image description here
这是相关模板,按钮在几个地方重复:
<!-- my base template -->
{% load static %}
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="{% static 'css/bootstrap.css' %}">
<title>Short Thoughts Posted Publicly Online</title>
</head>
<body>
<!-- I've got a navbar here, but I can't imagine that's relevant -->
<div class="container">
<div class="columns">
{% block content %}
{% endblock content %}
</div>
</div>
<script src="{% static 'js/bootstrap.bundle.js' %}"></script>
</body>
</html>
<!-- my registration template -->
{% extends 'base.html' %}
{% block content %}
<button type="button" class="btn btn-default">Register</button>
<div class="row">
<div class="shadow-none p-3 mb-5 bg-white rounded">
<form method="post">
{% csrf_token %}
{{form}}
</form>
<button type="button" class="btn btn-default">Register
</button>
</div>
<button type="button" class="btn btn-default">Register
</button>
</div>
<button type="button" class="btn btn-default">Register
</button>
{% endblock %}
娱乐一下,下面是我的views.py中的相关方法:
def register(request):
if request.method == "GET":
form = CustomUserCreationForm(request.GET)
return render(
request,
"users/register.html",
{"form": form}
)
elif request.method == "POST":
form = CustomUserCreationForm(request.POST)
if form.is_valid():
user = form.save()
login(request, user)
return redirect('dwitter:dashboard')
else:
return render(
request,
"users/register.html",
{"form": form}
)
aaa 和我的自定义表单 class
class CustomUserCreationForm(UserCreationForm):
username = forms.CharField(label='',min_length=5, max_length=150, widget=forms.TextInput(attrs={
"class": "form-control",
"placeholder": "Username",
"required": "False"
}))
email = forms.EmailField(label='',widget=forms.TextInput(attrs={
"class": "form-control",
"placeholder": "Email",
"required": False
}))
password1 = forms.CharField(label='', widget=forms.PasswordInput(attrs={
"class": "form-control",
"placeholder": "Password",
}))
password2 = forms.CharField(label='', widget=forms.PasswordInput(attrs={
"class": "form-control",
"placeholder": "Confirm Password",
}))
def username_clean(self):
username = self.cleaned_data['username'].lower()
new = User.objects.filter(username=username)
if new.count():
raise ValidationError("User Already Exist")
return username
def email_clean(self):
email = self.cleaned_data['email'].lower()
new = User.objects.filter(email=email)
if new.count():
raise ValidationError(" Email Already Exist")
return email
def clean_password2(self):
password1 = self.cleaned_data['password1']
password2 = self.cleaned_data['password2']
if password1 and password2 and password1 != password2:
raise ValidationError("Password don't match")
return password2
def save(self, commit=True):
user = User.objects.create_user(
self.cleaned_data['username'],
self.cleaned_data['email'],
self.cleaned_data['password1']
)
return user
顺便说一下,我也很难摆脱那些“这个字段是必需的标签”,但我不能正确地说我已经对这个问题进行了尽职调查
Bootstrap buttons 的正确 class 是主按钮的 btn btn-primary
。没有btn-default
.
要避免“此字段是必填标签”,请执行 classic Post/Redirect/Get。所以,
def register(request):
form = CustomUserCreationForm(request.POST or None)
if form.is_valid():
user = form.save()
login(request, user)
return redirect('dwitter:dashboard')
return render(request, "users/register.html", {"form": form})
想法是如果请求是 POST,那么 request.POST 将有数据,因此它将是 True,您可以检查表单有效性。如果请求是 GET,那么 request.POST 将没有数据,因此它将是 False,因此 None 部分将接管,为您提供一个未绑定的空表单。因此,最后一个 return 将具有一个空的、未绑定的表单,因此不会有任何错误。如果表单有效,将进行重定向。
编辑:刚刚意识到这个问题有多么臃肿,我的 html 格式多么糟糕。对不起,我在发帖前没注意到。现在正在修复它
因此,正如您可能在图像中看到的那样,我无法让 bootstrap 按钮正确显示在我的 Django 模板中。它旨在提交用户注册表,但如您所见,我已尝试将其放在几个地方以查看容器是否影响它:Bootstrap buttons as they appear in my project 当然,它应该是这样的: enter image description here 这是相关模板,按钮在几个地方重复:
<!-- my base template -->
{% load static %}
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="{% static 'css/bootstrap.css' %}">
<title>Short Thoughts Posted Publicly Online</title>
</head>
<body>
<!-- I've got a navbar here, but I can't imagine that's relevant -->
<div class="container">
<div class="columns">
{% block content %}
{% endblock content %}
</div>
</div>
<script src="{% static 'js/bootstrap.bundle.js' %}"></script>
</body>
</html>
<!-- my registration template -->
{% extends 'base.html' %}
{% block content %}
<button type="button" class="btn btn-default">Register</button>
<div class="row">
<div class="shadow-none p-3 mb-5 bg-white rounded">
<form method="post">
{% csrf_token %}
{{form}}
</form>
<button type="button" class="btn btn-default">Register
</button>
</div>
<button type="button" class="btn btn-default">Register
</button>
</div>
<button type="button" class="btn btn-default">Register
</button>
{% endblock %}
娱乐一下,下面是我的views.py中的相关方法:
def register(request):
if request.method == "GET":
form = CustomUserCreationForm(request.GET)
return render(
request,
"users/register.html",
{"form": form}
)
elif request.method == "POST":
form = CustomUserCreationForm(request.POST)
if form.is_valid():
user = form.save()
login(request, user)
return redirect('dwitter:dashboard')
else:
return render(
request,
"users/register.html",
{"form": form}
)
aaa 和我的自定义表单 class
class CustomUserCreationForm(UserCreationForm):
username = forms.CharField(label='',min_length=5, max_length=150, widget=forms.TextInput(attrs={
"class": "form-control",
"placeholder": "Username",
"required": "False"
}))
email = forms.EmailField(label='',widget=forms.TextInput(attrs={
"class": "form-control",
"placeholder": "Email",
"required": False
}))
password1 = forms.CharField(label='', widget=forms.PasswordInput(attrs={
"class": "form-control",
"placeholder": "Password",
}))
password2 = forms.CharField(label='', widget=forms.PasswordInput(attrs={
"class": "form-control",
"placeholder": "Confirm Password",
}))
def username_clean(self):
username = self.cleaned_data['username'].lower()
new = User.objects.filter(username=username)
if new.count():
raise ValidationError("User Already Exist")
return username
def email_clean(self):
email = self.cleaned_data['email'].lower()
new = User.objects.filter(email=email)
if new.count():
raise ValidationError(" Email Already Exist")
return email
def clean_password2(self):
password1 = self.cleaned_data['password1']
password2 = self.cleaned_data['password2']
if password1 and password2 and password1 != password2:
raise ValidationError("Password don't match")
return password2
def save(self, commit=True):
user = User.objects.create_user(
self.cleaned_data['username'],
self.cleaned_data['email'],
self.cleaned_data['password1']
)
return user
顺便说一下,我也很难摆脱那些“这个字段是必需的标签”,但我不能正确地说我已经对这个问题进行了尽职调查
Bootstrap buttons 的正确 class 是主按钮的 btn btn-primary
。没有btn-default
.
要避免“此字段是必填标签”,请执行 classic Post/Redirect/Get。所以,
def register(request):
form = CustomUserCreationForm(request.POST or None)
if form.is_valid():
user = form.save()
login(request, user)
return redirect('dwitter:dashboard')
return render(request, "users/register.html", {"form": form})
想法是如果请求是 POST,那么 request.POST 将有数据,因此它将是 True,您可以检查表单有效性。如果请求是 GET,那么 request.POST 将没有数据,因此它将是 False,因此 None 部分将接管,为您提供一个未绑定的空表单。因此,最后一个 return 将具有一个空的、未绑定的表单,因此不会有任何错误。如果表单有效,将进行重定向。