html - 从 django 模型表单中删除字段会破坏 HTML 中的格式
问题描述
从我的 forms.py django 表单中删除一个字段会删除格式,尽管表单可以正常工作。如果我删除“useremail”(因为它现在与标准 django 用户模型电子邮件配对),所有格式/占位符等都会从 HTML 中的所有字段中删除。如果我删除 4 个字段中的任何一个,就会发生这种情况。
所有表单都可以工作,尽管它失去了对属性和样式的任何控制。图 1显示了包含以下所有内容的 html(这很好用)。如果我从 forms.py 中删除“useremail”,格式会中断,如图2 所示。
控制台中没有错误消息标志
表格.py
class CreateUserForm(UserCreationForm):
password2 = None
class Meta:
model = User
fields = ['username', 'email', 'password1']
def clean_password1(self):
password1 = self.cleaned_data.get('password1')
try:
password_validation.validate_password(password1, self.instance)
except forms.ValidationError as error:
# Method inherited from BaseForm
self.add_error('password1', error)
return password1
class SafezoneForm(forms.ModelForm, admin.ModelAdmin):
name = forms.CharField(label='Safezone name',widget=forms.TextInput
(attrs={'id': 'name', 'label': 'Name of Safezone', 'class': 'form-inputs'}))
useremail = forms.CharField(label='Your Email', widget=forms.EmailInput
(attrs={'id': 'useremail','class': 'form-inputs',"placeholder": "mike@xyz.com"}))
latitudecentre = forms.FloatField(label='Marker Latitude',widget=forms.TextInput
(attrs={'id': 'latitudecentre','class': 'form-inputs', 'readonly': True}))
longitudecentre = forms.FloatField(label='Marker Longitude',widget=forms.TextInput
(attrs={'id': 'longitudecentre','class': 'form-inputs', 'readonly': True}))
class Meta:
model = Safezone
模型.py
class Safezone(models.Model):
userid = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
useremail = models.EmailField(User, null=True)
name = models.CharField(max_length=100, null=True)
latitudecentre = models.FloatField(null=True)
longitudecentre = models.FloatField(null=True)
latcorner1 = models.FloatField(null=True)
def save(self, *args, **kwargs):
self.latcorner1 = self.latitudecentre + 0.1
super(Safezone, self).save(*args, **kwargs)
def __str__(self):
return str(self.userid) or ''
视图.py
def collapsecard(request):
if request.method == 'POST':
create_user_form = CreateUserForm(request.POST)
safezone_form = SafezoneForm(request.POST)
if create_user_form.is_valid() and safezone_form.is_valid():
user = create_user_form.save()
safezone = safezone_form.save(commit=False)
safezone.userid = user
safezone.useremail = user.email
safezone.save()
return redirect('login')
return redirect('safezoneaddedpage')
else:
create_user_form = CreateUserForm()
safezone_form = SafezoneForm()
return render(request, 'V2maparonno_create_safe_zoneV2.html',
{'create_user_form': create_user_form, 'safezone_form': safezone_form})
HTML / 模板文件提取
<div id="accordion">
<div class="card" style="width: 23rem;">
<div class="card-header" id="headingOne">
<p class="mb-0">
<div class="accordianstandard" data-toggle="collapse" data-target="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
xxx
</div>
</div>
<div id="collapseOne" class="collapse show" aria-labelledby="headingOne" data-parent="#accordion">
<div class="card-body">
<img src="https://pupaprojectawsbucket.s3.eu-west-2.amazonaws.com/aus.png" width="120" height="120" class="cardimage" alt="australia bushfire alert">
<p>xxx.</p>
<p>Drag the marker over your home.</p>
<div style="padding-left: 30%;">
<button class="btn btn-sm btn-outline-primary" type="button" value="clickme" data-toggle="collapse" data-target="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">Next</button>
<button class="btn btn-sm btn-outline-secondary" type="button" id="reset-btn">Reset</button>
</div>
</div>
</div>
</div>
<div class="card" style="width: 23rem;">
<div class="card-header" id="headingTwo">
<p class="mb-0">
<div class="accordianstandard" data-toggle="collapse" data-target="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">
Safezone notification
</div>
</div>
<div id="collapseTwo" class="collapse" aria-labelledby="headingTwo" data-parent="#accordion">
<form action="" method="POST" class="form-control">
{% csrf_token %}
{{safezone_form.as_p}}
{{create_user_form.as_p}}
<input class="btn btn-sm btn-outline-primary" type="submit" name="Submit">
<button class="btn btn-sm btn-outline-secondary" type="button">Reset</button>
<div class="disclaimer">
<p>By clicking submit you agree to receiving email alerts from pupa.</p>
</div>
</form>
</div>
</div>
</div>
CSS
body {
margin: 0;
padding: 0;
min-height: 100vh;
font-family: 'Helvetica Neue', Helvetica Bold;
}
.navbar-custom-mobile {
background-color: black;
padding: 30px;
}
.navbar-custom-mobile .navbar-brand,
.navbar-custom-mobile .navbar-text {
color: white;
}
.navbar-custom {
background-color: black;
padding: 50px;
}
.navbar-custom .navbar-brand,
.navbar-custom .navbar-text {
color: white;
}
#map {
position: absolute;
top: 100px;
bottom: 0%;
width: 100%;
}
h1 {
font-size: 20px;
line-height: 30px;
}
h2 {
font-size: 14px;
line-height: 20px;
margin-bottom: 10px;
}
a {
text-decoration: none;
color: #2dc4b2;
}
#geocoder-container > div {
min-width: 50%;
margin-left: 25%;
}
.coordinates {
background: rgba(0, 0, 0, 0.5);
color: #fff;
position: absolute;
bottom: 70px;
left: 10px;
padding: 5px 10px;
margin: 0;
font-size: 11px;
line-height: 18px;
border-radius: 3px;
display: none;
}
.card-deck {
position: relative;
top: 550px;
padding: 20px;
}
.card { position: relative;
top: 20px;
left: 20px;
padding: 0px;
}
.mobileHide { display: inline; }
/* Smartphone Portrait and Landscape */
@media only screen
and (min-device-width : 320px)
and (max-device-width : 480px){
.mobileHide { display: none;}
}
.mobileShow {display: none;}
/* Smartphone Portrait and Landscape */
@media only screen
and (min-device-width : 320px)
and (max-device-width : 480px){
.mobileShow {display: inline;}
}
.cardmobile { position: absolute;
bottom: 1px;
left: 2%;
font-size: 14px;
}
.card-bottom-custom-mobile {
padding: 12px;
padding-left: 15px;
padding-top:12px;
padding-bottom:12px;
background: white;
color: black;
font-family: 'Helvetica Neue', Helvetica Bold;
font-size: 14px;
}
.card-header-custom-mobile {
padding: 18px;
padding-left: 15px;
padding-top:15px;
padding-bottom:8px;
background: black;
color: white;
}
.card-header-custom {
padding: 15px;
padding-left: 20px;
padding-top:20px;
background: black;
color: white;
}
.card-bottom-custom {
padding: 20px;
padding-left: 20px;
padding-top:20px;
padding-bottom:20px;
background: white;
color: black;
}
.form-inputs {
color: black;
font-family: 'Helvetica Neue', Helvetica Bold;
font-size: 13px;
padding-right: 50%;
padding-left:5%;
padding-top: 5%;
padding-bottom: 5%;
margin-left: 0%;
}
.form-control {
color: black;
font-family: "Helvetica Neue", Helvetica, Ariel;
font-size: 13px;
font-weight: bold;
color: #666666;
padding-right: 150px;
padding-left: 70px;
padding-top: 20px;
}
.accordianstandard {
color: black;
font-family: "Helvetica Neue", Helvetica, Ariel;
font-size: 13px;
font-weight: bold;
color: #666666;
padding-right: 20px;
padding-left: 10px;
padding-top: 0px;
}
.card-body {
color: black;
font-family: "Helvetica Neue", Helvetica, Ariel;
font-size: 15px;
font-weight: normal;
padding-left: 30px;
padding-right: 30px;
color: #666666;
}
.disclaimer {
padding-top: 7px;
font-family: "Helvetica Neue", Helvetica, Ariel;
font-size: 9px;
font-weight: normal;
}
map.addLayer({
'id': 'point1',
'type': 'circle',
'source': 'point',
'paint': {
'circle-radius': 6,
'circle-color': '#ff8304'
}
});
.divider{
width:5px;
height:auto;
display:inline-block;
}
.marker-div {
cursor: move;
}
.marker-div img {
height:110px;
width:55px;
}
.cardimage {
display: block;
margin-left: auto;
margin-right: auto;
margin-bottom: 20px;
width: 40%;
}
解决方案
您的班级缺少fields
属性。Django 应该在这里抛出一个异常,就我而言,这正是发生的事情。请参阅以下内容:SafezoneForm
Meta
Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is prohibited; form SafezoneForm needs updating.
所以,我已经删除了useremail
字段并将fields
属性添加到SafezoneForm
'sMeta
类。这是它现在的样子:
class SafezoneForm(forms.ModelForm, admin.ModelAdmin):
name = forms.CharField(label='Safezone name', widget=forms.TextInput(attrs={'id': 'name', 'label': 'Name of Safezone', 'class': 'form-inputs'}))
latitudecentre = forms.FloatField(label='Marker Latitude', widget=forms.TextInput(attrs={'id': 'latitudecentre', 'class': 'form-inputs', 'readonly': True}))
longitudecentre = forms.FloatField(label='Marker Longitude', widget=forms.TextInput(attrs={'id': 'longitudecentre', 'class': 'form-inputs', 'readonly': True}))
class Meta:
model = Safezone
fields = ['name', 'latitudecentre', 'longitudecentre']
它似乎对我有用。确保您是最新的 Django 版本。
推荐阅读
- java - ThreadLocal set() 然后立即 get() 并不总是获取值
- single-sign-on - 无法使用 Visualize.js 使用 Keycloak SSO 令牌登录
- javascript - 禁用手动键盘输入 JavaScript/Oracle JET
- pug - 哈巴狗表单输入类型=文本属性“大小”不起作用?
- amazon-web-services - AWS Lambda 无服务器应用程序 - .Net Core 与 Asp.Net Core(多个与单个)
- python - 子类化 Flask 可插拔视图以实现可扩展功能的最佳方式
- swift - 如何在帮助类中使用 DataSnapshot 对象?
- amazon-web-services - 无论登录如何,是否都有适用于 AWS 的通用 Cognito Id?
- r - 如何使用 R 删除多个文件的部分文件名
- unity3d - 从Android上的文件夹中迭代和读取文本文件