Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:使用AutoField编辑模型表单_Python_Django Models_Django Forms_Autofield - Fatal编程技术网

Python Django:使用AutoField编辑模型表单

Python Django:使用AutoField编辑模型表单,python,django-models,django-forms,autofield,Python,Django Models,Django Forms,Autofield,我试图创建一个视图,用户可以通过模板中的表单编辑DB记录。我搜索了很多网页(还有Django文档),在这些网页上,他们教授如何创建这些视图,但他们总是使用Django为每个模型生成的“id”。在这个特定的模型中,我必须使用自动字段来覆盖“id”。有没有办法使用这个自动字段作为Django记录的“id” 这是我的完整模型: class T031003 (models.Model): C003IDCD = AutoField(primary_key=True) C003INST = m

我试图创建一个视图,用户可以通过模板中的表单编辑DB记录。我搜索了很多网页(还有Django文档),在这些网页上,他们教授如何创建这些视图,但他们总是使用Django为每个模型生成的“id”。在这个特定的模型中,我必须使用自动字段来覆盖“id”。有没有办法使用这个自动字段作为Django记录的“id”

这是我的完整模型:

class T031003 (models.Model): 
   C003IDCD = AutoField(primary_key=True)
   C003INST = models.IntegerField(unique=True) #usar AutoSlug
   C003TPCD = models.CharField(max_length=1)
   C003CHCD = models.CharField(max_length=14)
   C003MTR = models.CharField(max_length=30, blank=True, null=True)
   C003CTCD = models.CharField(max_length=3)
   C003RZSC = models.CharField(max_length=60, blank=True, null=True)
   C003EML = models.EmailField(max_length = 254, blank=True, null=True)
   C003LOGA = models.CharField(max_length=20)
   C003LOGB = models.DateTimeField()
   C003LOGD = models.CharField(max_length=15, blank=True, null=True)
   C003LOGF = models.CharField(max_length=20, blank=True, null=True)

   def __unicode__(self):
       return '%s' %  self.C003MTR

   class T031003Form(ModelForm):
       class Meta:
          model = T031003
          ordering = ["-C003MTR"]
          exclude = ('C003LOGA','C003LOGB','C003LOGD','C003LOGE','C003LOGF')
这是我尝试执行的视图,但它给出了错误“No T031003匹配给定查询”。这是正确的,因为表中没有“id”:

def t031003form_edit(request, id=None):
pin = get_object_or_404(T031003, pk=id)
form = T031003Form(request.POST or None, instance=pin)
if request.method == 'POST':
    if form.is_valid():
        form = form.save(False)
        form.C003LOGA = request.user
        form.C003LOGB = datetime.date.today()
        form.C003LOGD = request.META['REMOTE_ADDR']
        form.C003LOGF = request.META['USERDOMAIN']
        form.save()
        form = T031003Form()
    else:
        return HttpResponseRedirect('/erro/')
return render_to_response('T031003Form_edit.html', {'form': form,}, context_instance=RequestContext(request))

任何帮助都将不胜感激

如果模型有一个自动字段(一个自动递增的主键),那么在您第一次调用save()时,该自动递增的值将被计算并保存为对象上的一个属性:

在调用save()之前,无法确定ID的值,因为该值是由数据库计算的,而不是由Django计算的


ref:

好吧,多亏了一位亲密朋友的帮助,我可以使用表单集来完成这个任务。以下是观点:

def t031002form_edit(request, id_auto):
j = get_object_or_404(T031002, pk=id_auto)

T031003FormSet = modelformset_factory(T031002, can_delete=True, max_num=1)

if request.method == 'POST':
    form = T031002FormSet(request.POST or None, request.FILES or None, queryset=T031002.objects.filter(pk=id_auto)) 
    if form.is_valid():
        instance = form.save(commit=False)
        form.C003LOGA = request.user
        form.C003LOGB = datetime.date.today()
        form.C003LOGD = request.META['REMOTE_ADDR']
        form.C003LOGF = request.META['USERDOMAIN']
        for reform in instance:
            reform.save()
    else:
       return HttpResponseRedirect('/erro/')
else:
    form = T031002FormSet(queryset=T031002.objects.filter(pk=id_auto))  
return render_to_response(('T031002Form_edit.html'), {'form': form,}, context_instance=RequestContext(request))

因此,使用表单集,您可以轻松地工作。希望它能帮助其他人回答同样的问题。

谢谢你的解释!因此,如果我在数据库中已经有两条记录,而我没有“id”,因为我在模型中使用的自动字段已经覆盖了它,那么我如何编辑一条精确的记录?我应该将哪些参数传递给该方法?如果我没有将“id”作为参数来标识数据库中我要修改的记录,
def t03103form\u edit(request,id=None):
那么我应该传递什么?例如,在“def”中,如果我设置pk=1而不是pk=id,它总是通过视图选择要修改的表的第一条记录。但是,如果我想通过视图修改任何记录,我如何识别我正在修改的记录?感谢您的耐心,只是这件事对我来说有点难理解。在您的代码中,更改C003IDCD=models.AutoField(primary_key=True)如果您想在视图中处理模型的对象,您需要首先保存对象以获取id,或者您可以只使用模型名称而不是对象。只需额外添加一点:“id_auto”是您将通过url传递的值。在url.py中,您将有
url(r'^T031002表单编辑/(?P\d+/),'Mod031.views.T031002表单编辑')
,在模板中,您将传递类似于:/T031002表单编辑/1/的内容,这将引导您找到数据库中的记录,其中的“id”等于1(本例中的id是自动字段)。
def t031002form_edit(request, id_auto):
j = get_object_or_404(T031002, pk=id_auto)

T031003FormSet = modelformset_factory(T031002, can_delete=True, max_num=1)

if request.method == 'POST':
    form = T031002FormSet(request.POST or None, request.FILES or None, queryset=T031002.objects.filter(pk=id_auto)) 
    if form.is_valid():
        instance = form.save(commit=False)
        form.C003LOGA = request.user
        form.C003LOGB = datetime.date.today()
        form.C003LOGD = request.META['REMOTE_ADDR']
        form.C003LOGF = request.META['USERDOMAIN']
        for reform in instance:
            reform.save()
    else:
       return HttpResponseRedirect('/erro/')
else:
    form = T031002FormSet(queryset=T031002.objects.filter(pk=id_auto))  
return render_to_response(('T031002Form_edit.html'), {'form': form,}, context_instance=RequestContext(request))