模板选取字典最后一个值

要使用自定义过滤器
模板自带的make_list过滤器没什么用,它只会把所有传入的参数转成字符串再一个一个的切片['s','t','r']
myapp_extras.py

  1. from django import template
  2. register = template.Library()
  3. @register.filter
  4. def getlastkv(value):
  5. lastkey = list(value)[-1]
  6. lastvalue = value[lastkey]
  7. v = lastkey+':'+lastvalue
  8. return v

mytemplate.html

  1. {% for item in apply_all %}
  2. {{item.procedure|getlastkv}}
  3. {% endfor %}

models.py

  1. class Apply(models.Model):
  2. procedure = models.JSONField()

自定义表单form的错误信息error_message

从模型生成的表单

  1. class SupplierForm(ModelForm):
  2. class Meta:
  3. model = Supplier
  4. fields = '__all__'
  5. error_messages = {
  6. 'fieldname':{'unique':'该字段禁止重复!'},
  7. }

后台获取多选select的值

  1. <select name="material" class="js-example-basic-multiple" multiple="multiple">
  2. {% for obj in tags %}
  3. <option value="{{ obj.pk }}">{{obj}}</option>
  4. {% endfor %}
  5. </select>

views.py

  1. mt = self.request.GET.getlist("material")

获取模型字段所有的属性(fields)名称/值

只需要获取model的全部fields名字

views.py

  1. from .models import Bargain # 导入模型(model)
  2. field_list = [f.verbose_name for f in Bargain._meta.fields]

获取字段变量名用f.name

需要获取model下每个实例对应field的值

models.py

  1. TYPE_CHOICES = [
  2. ('0','工艺设备'),
  3. ('1','电气仪控'),
  4. ('2','其他'),
  5. ]
  6. class Bargain(models.Model):
  7. itemType = models.CharField(
  8. verbose_name='设备类型',
  9. max_length=1,
  10. choices=TYPE_CHOICES,
  11. default='0',blank=True,null=True
  12. )
  13. def get_fields_value_dict(self):
  14. return {field.verbose_name:field.value_from_object(self)
  15. if field.value_from_object(self) else ''
  16. for field in self.__class__._meta.fields}

需要注意构建的这个方法只会记录字段的值,这里返回的字典是{'设备类型':'0'},要显示工艺设备,目前好像只能在获取字典后再修改,dict['设备类型'] = bargain.get_itemType_display()。目前field只有value_from_object可以返回值。

表单验证错误时修改widget的attr

forms.py

  1. from django.forms import ModelForm
  2. from .models import Sample
  3. class SampleForm(ModelForm):
  4. class Meta:
  5. model = Sample
  6. fields = '__all__'
  7. widgets = {'address': TextInput(attrs={'class': 'form-control', 'placeholder': "地址"})}
  8. # 重写__init__来修改attr
  9. def __init__(self, *args, **kwargs):
  10. if self.errors:
  11. err_keys = list(self.errors.keys())
  12. for k in err_keys:
  13. self.fields[k].widget.attrs.update({'class':"form-control is-invalid"})