先回忆下以前的操作:
创建Django以及app01配置相关,
urls.py:
url(r'^index/', views.index)
models.py:
from django.db import models class UserType(models.Model): caption = models.CharField(max_length=32) class UserInfo(models.Model): username = models.CharField(max_length=32) email = models.EmailField() user_type = models.ForeignKey(to='UserType', to_field='id', on_delete=models.CASCADE)
views.py:
from django.shortcuts import render from django import forms from django.forms import fields from app01 import models class UserInfoForm(forms.Form): username = fields.CharField(max_length=32) email = fields.EmailField() user_type = fields.ChoiceField( choices=models.UserType.objects.values_list('id', 'caption') ) def __init__(self, *args, **kwargs): super(UserInfoForm, self).__init__(*args, **kwargs) self.fields['user_type'].choices = models.UserType.objects.values_list('id', 'caption') def index(request): if request.method == "GET": obj = UserInfoForm() return render(request, 'index.html', {'obj': obj}) elif request.method == "POST": obj = UserInfoForm(request.POST) obj.is_valid() models.UserInfo.objects.create(**obj.cleaned_data) models.UserInfo.objects.filter(id=1).update(**obj.cleaned_data) return render(request, 'index.html', {'obj': obj})
index.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/index/" method="POST"> {% csrf_token %} {{ obj.as_p }} <input type="submit" value="提交"/> </form> </body> </html>
下面是ModelForm操作:
urls.py:
url(r'^index/', views.index), url(r'^user_list/', views.user_list), url(r'^edit-(\d+)/', views.user_edit),
models.py:
from django.db import models class UserType(models.Model): caption = models.CharField(max_length=32) class UserGroup(models.Model): name = models.CharField(max_length=32) class UserInfo(models.Model): username = models.CharField(max_length=32) email = models.EmailField() user_type = models.ForeignKey(to='UserType', to_field='id', on_delete=models.CASCADE) u2g = models.ManyToManyField(UserGroup) #强大之处在于:多对多也适用
views.py:
from django.shortcuts import render from django import forms from app01 import models from django.forms import widgets as Fwidgets from django.forms import fields as Ffields class UserInfoModelForm(forms.ModelForm): id_rmb = Ffields.CharField( widget=Fwidgets.CheckboxInput(), label="一个月内免登录" ) class Meta: model = models.UserInfo fields = '__all__' labels = { 'username': '用户名', 'email': '邮箱', } help_texts = { 'username': '...', } widgets = { #'username': Fwidgets.PasswordInput(attrs={'class': 'c1'}) } error_messages = { 'email': { 'required': '邮箱不能为空', 'invalid': '邮箱格式错误', } } field_classes = { #'email': Ffields.URLField } def clean_username(self): old = self.cleaned_data['username'] return old def index(request): if request.method == "GET": obj = UserInfoModelForm() return render(request, 'index.html', {'obj': obj}) elif request.method == "POST": obj = UserInfoModelForm(request.POST) if obj.is_valid(): obj.save() return render(request, 'index.html', {'obj': obj}) def user_list(request): li = models.UserInfo.objects.all().select_related('user_type') return render(request, 'user_list.html', {'li': li}) def user_edit(request, nid): if request.method == "GET": user_obj = models.UserInfo.objects.filter(id=nid).first() mf = UserInfoModelForm(instance=user_obj) return render(request, 'user_edit.html', {'mf': mf, 'nid': nid}) elif request.method == "POST": user_obj = models.UserInfo.objects.filter(id=nid).first() mf = UserInfoModelForm(request.POST, instance=user_obj) if mf.is_valid(): mf.save() else: pass return render(request, 'user_edit.html', {'mf': mf, 'nid': nid})
user_list.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <ul> {% for row in li %} <li>{{ row.username }}-{{ row.user_type.caption }}-<a href="/edit-{{ row.id }}/">编辑</a></li> {% endfor %} </ul> </body> </html>
user_edit.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/edit-{{ nid }}/" method="POST"> {% csrf_token %} {{ mf.as_p }} <input type="submit" value="修改"/> </form> </body> </html>