[django]django corepython核心编程

model meta排序

class BlogPost(models.Model):
    title = models.CharField(max_length=150)
    body = models.TextField()
    timestamp = models.DateTimeField()

    class Meta:
        ordering = ('-timestamp',)
def archive(request):
    posts = BlogPost.objects.all()[:10]
    return direct_to_template(request, 'archive.html',
        {'posts': posts, 'form': BlogPostForm()})

def create_blogpost(request):
    if request.method == 'POST':
        form = BlogPostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.timestamp = datetime.now()
            post.save()
    return HttpResponseRedirect('/blog/')

django的form处理数据

1.生成html
2.验证数据合法性
3.直接存库

定义1个form

class BlogPost(models.Model):
    title = models.CharField(max_length=150)
    body = models.TextField()
    timestamp = models.DateTimeField()

以前是这样的

class BlogPostForm(forms.Form):
    title = forms.CharField(max_length=150)
    body = forms.CharField(widget=forms.Textarea)
    timestamp = forms.DateTimeField()

现在可以这样了

class BlogPostForm(forms.ModelForm):
    class Meta:
        model = BlogPost

在这个例子中,不信赖用户输入正确的时间戳,而是想让应用为每篇博文以可编程的方
式添加这个内容。这一点不难,只须添加额外一个名为exclude的属性,从生成的HTML中
移除这个表单项。向blog/models.py文件中添加相应的导入语句,并在该文件的底部,BlogPost
定义的后面添加完整的BlogPostForm类。

class BlogPostForm(forms.ModelForm):
    class Meta:
        model = BlogPost
        exclude = ('timestamp',)

看下form如何生成html的

除了save

保存数据: 有了form后就不用这样保存数据了

def create_blogpost(request):
    if request.method == 'POST':
        BlogPost(
        title=request.POST.get('title'),
        body=request.POST.get('body'),
        timestamp=datetime.now(),
        ).save()
    return HttpResponseRedirect('/blog/')

可以这样

def create_blogpost(request):
    if request.method == 'POST':
        form = BlogPostForm(request.POST)
        if form.is_valid():
            form.save()
    return HttpResponseRedirect('/blog/')

遗憾的是,因为有timestamp,所以不能这样做。必须对前面的HTML表单生成过程进行特殊处理。所以需要像下面这样,使用if语句。

if form.is_valid():
    post = form.save(commit=False)
    post.timestamp=datetime.now()
    post.save()
posted @ 2018-09-19 15:02  mmaotai  阅读(236)  评论(0编辑  收藏  举报