模板选取字典最后一个值
要使用自定义过滤器
模板自带的make_list过滤器没什么用,它只会把所有传入的参数转成字符串再一个一个的切片['s','t','r']
myapp_extras.py
from django import template
register = template.Library()
@register.filter
def getlastkv(value):
lastkey = list(value)[-1]
lastvalue = value[lastkey]
v = lastkey+':'+lastvalue
return v
mytemplate.html
{% for item in apply_all %}
{{item.procedure|getlastkv}}
{% endfor %}
models.py
class Apply(models.Model):
procedure = models.JSONField()
自定义表单form的错误信息error_message
从模型生成的表单
class SupplierForm(ModelForm):
class Meta:
model = Supplier
fields = '__all__'
error_messages = {
'fieldname':{'unique':'该字段禁止重复!'},
}
后台获取多选select的值
<select name="material" class="js-example-basic-multiple" multiple="multiple">
{% for obj in tags %}
<option value="{{ obj.pk }}">{{obj}}</option>
{% endfor %}
</select>
views.py
mt = self.request.GET.getlist("material")
获取模型字段所有的属性(fields)名称/值
只需要获取model的全部fields名字
views.py
from .models import Bargain # 导入模型(model)
field_list = [f.verbose_name for f in Bargain._meta.fields]
需要获取model下每个实例对应field的值
models.py
TYPE_CHOICES = [
('0','工艺设备'),
('1','电气仪控'),
('2','其他'),
]
class Bargain(models.Model):
itemType = models.CharField(
verbose_name='设备类型',
max_length=1,
choices=TYPE_CHOICES,
default='0',blank=True,null=True
)
def get_fields_value_dict(self):
return {field.verbose_name:field.value_from_object(self)
if field.value_from_object(self) else ''
for field in self.__class__._meta.fields}
需要注意构建的这个方法只会记录字段的值,这里返回的字典是{'设备类型':'0'}
,要显示工艺设备
,目前好像只能在获取字典后再修改,dict['设备类型'] = bargain.get_itemType_display()
。目前field只有value_from_object
可以返回值。
表单验证错误时修改widget的attr
forms.py
from django.forms import ModelForm
from .models import Sample
class SampleForm(ModelForm):
class Meta:
model = Sample
fields = '__all__'
widgets = {'address': TextInput(attrs={'class': 'form-control', 'placeholder': "地址"})}
# 重写__init__来修改attr
def __init__(self, *args, **kwargs):
if self.errors:
err_keys = list(self.errors.keys())
for k in err_keys:
self.fields[k].widget.attrs.update({'class':"form-control is-invalid"})