关于django中ModelForm的instance

我使用ModelForm修改数据库数据时,总是添加一条新的记录,而且原来的记录维持不变,搞了一天也没弄明白怎么回事就,最后用一种很笨得方法解决了,其中N多东西不明白,先记下了,以后慢慢研究。


原来的代码:
def edit(request,id,entry,form,str): 
    item_id = int(id) 
    item = get_object_or_404(entry,pk=item_id) 
    if request.method == 'POST': 
        edit_form = form(request.POST,instance=item)
        if edit_form.is_valid(): 
            edit_form.save() 
            return HttpResponseRedirect('/'+str+'/list/1') 
    else: 
        edit_form = form(instance=item) 
        return render_to_response('equipment/edit.html', {'edit_form':edit_form,'str':str}) 


id是需要修改记录的主键,entry是记录的Model,form是ModelForm
使用这段代码修改一个记录时,原来的记录没有被
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Django ,使用 ModelForm 可以方便地将模型的数据映射到表单上,并且可以通过表单来对模型的数据进行增删改查等操作。如果需要在网页上上传多个文件并将文件内容保存到数据库,可以使用 Django 的 MultiValueDict 来实现。 下面是一个示例代码,演示了如何使用 ModelForm 和 MultiValueDict 来实现多文件上传,并将文件内容保存到数据库: ```python # models.py from django.db import models class File(models.Model): name = models.CharField(max_length=255) content = models.TextField() # forms.py from django import forms from django.forms import inlineformset_factory from .models import File class FileForm(forms.ModelForm): class Meta: model = File fields = ('name',) class ContentForm(forms.ModelForm): class Meta: model = File fields = ('content',) ContentFormSet = inlineformset_factory(File, File, form=ContentForm, extra=1) # views.py from django.shortcuts import render from django.utils.datastructures import MultiValueDictKeyError from .forms import FileForm, ContentFormSet def upload(request): if request.method == 'POST': form = FileForm(request.POST, request.FILES) content_formset = ContentFormSet(request.POST, request.FILES, instance=File()) if form.is_valid() and content_formset.is_valid(): file = form.save() for content_form in content_formset: try: content = content_form.cleaned_data['content'] file.content = content.read() file.save() except MultiValueDictKeyError: pass else: form = FileForm() content_formset = ContentFormSet(instance=File()) return render(request, 'upload.html', {'form': form, 'content_formset': content_formset}) ``` 在上述代码,首先定义了一个模型 `File`,其包含了两个字段 `name` 和 `content`,分别用于保存文件名和文件内容。然后定义了两个表单 `FileForm` 和 `ContentForm`,其 `FileForm` 用于上传文件名,`ContentForm` 用于上传文件内容。同时使用 `inlineformset_factory` 创建了一个 `ContentFormSet`,用于在网页上动态添加多个 `ContentForm` 表单。 在视图函数 `upload` ,首先判断请求的方法是否为 POST,如果是,则创建两个表单实例,并分别对它们进行校验。如果表单数据有效,则先保存 `FileForm` 的表单数据,然后遍历 `ContentFormSet` 的所有表单数据,将每个上传的文件的内容读取出来,并保存到数据库。最后将表单渲染到网页上。 需要注意的是,为了在上传文件时能够正确地读取文件内容,需要将表单的 `enctype` 设置为 `multipart/form-data`,并且在视图函数使用 `request.FILES` 来获取上传的文件数据。 希望这个示例可以帮助你实现多文件上传并保存到数据库。如果还有其他问题,可以继续提问哦~

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值