2014-11-24 49 views
0

型号:Django的预填充表单上更新记录提交

class locations(models.Model):#table 
    Name = models.CharField(max_length=50,default='Joes quick stop', unique=True) 
    shop_code = models.CharField(max_length=5,default='AB005',unique=True) 
    manager = models.ManyToManyField(users) 
    ast_manager = models.ManyToManyField(users, blank=True, related_name='ast_mng') 
    sales_manager = models.ManyToManyField(users, blank=True, related_name='sales_mng') 

形式:

class locations(models.Model): 
    Name = models.CharField(max_length=50,default='Joes quick stop', unique=True) 
    shop_code = models.CharField(max_length=5,default='AB005',unique=True) 
    manager = models.ManyToManyField(users) 
    ast_manager = models.ManyToManyField(users, blank=True, related_name='ast_mng') 
    sales_manager = models.ManyToManyField(users, blank=True, related_name='sales_mng') 

class locationsForm(ModelForm): 
    class Meta: 
     model = locations 

查看

def locations(request): 
    locations = locations.objects.values().filter(id=request.session['location']) 
    data=locations[0] 
    if request.method == 'GET': 
      if request.session['Manager']== True: 
       form = locationsForm(initial=data) 
      context = {'locations': locations, 'form': form} 
      return render(request, 'locations/locations.html', context) 
    elif request.method == 'POST': 
      form=locationsForm(request.POST, instance=data) 
      if form.is_valid(): 
       cd=form.cleaned_data 
       form.save() 
       form = locationsForm() 
       locations= locations.objects.values().filter(id=request.session['depot']) 
       context = {'locations': locations} 
       return render(request, 'locations/locations.html', context) 
      else: 
       context = {'locations': locations, 'form': form} 
       return render(request, 'locations/locations.html', context) 

我想显示填充了一个表格相关数据但用户可以更改并保存/更新表单。上面的代码在用相关数据显示表单时做得很好,但是当用户试图提交时,系统会尝试保存新记录而不是更新旧记录并失败。我从来没有过去if form.is_valid():

+0

表单上的错误是什么?你可以用''{{form.errors}}''' – schillingt 2014-11-25 00:10:31

+0

来查看你的模板。错误是“这个名称的位置已经存在”。每个需要唯一值的字段都会显示错误。这就是为什么我想它是试图创造一个新的记录,而不是更新旧的。 – Jay42 2014-11-25 00:27:16

回答

1

你的问题是,你正在将你的locations对象转换成字典列表。然后将字典传递到表格instance

发生这种情况是因为您正在调用查询集上的.values()方法。该方法返回一个特殊的ValuesQuerySet,它基本上看起来像一个词典列表。不是locations对象的列表。

表单上的instance参数需要是对象而不是字典。所以只需简单地删除.values()调用,它应该可以工作。像这样:

def locations(request): 
    locations = locations.objects.filter(id=request.session['location']) 
    first_location=locations[0] 
    if request.method == 'GET': 
     if request.session['Manager']== True: 
      form = locationsForm(instance=first_location) 
     context = {'locations': locations, 'form': form} 
     return render(request, 'locations/locations.html', context) 
    elif request.method == 'POST': 
     form=locationsForm(request.POST, instance=first_location) 
     if form.is_valid(): 
      cd=form.cleaned_data 
      form.save() 
      form = locationsForm() 
      locations= locations.objects.values().filter(id=request.session['depot']) 
      context = {'locations': locations} 
      return render(request, 'locations/locations.html', context) 
     else: 
      context = {'locations': locations, 'form': form} 
      return render(request, 'locations/locations.html', context) 
+0

这工作,非常感谢你。 – Jay42 2014-11-25 18:02:27