【问题标题】:Django Admin - def response_add cannot find obj.idDjango Admin - def response_add 找不到 obj.id
【发布时间】:2016-04-29 05:18:02
【问题描述】:

当我在Redirect on admin Save 尝试 Daniel Roseman 和 Tim Diggins 的上述建议时,如果我输入一个 URL 并指定 obj.id,它可以工作,但是当我使用 obj.id 时,它会给出 Django 的错误找不到“无”。为了解决这个问题,我必须在我的模型中找到 id 的最大值并使用它(如下所示)。

def response_add(self, request, obj, post_url_continue=None):
    arunidlist = arun.objects.values_list('id', flat=True)
    newpk = max(arunidlist)
    return HttpResponseRedirect("/admin/nbig/arun/%s" % str(newpk)) 
    # this did not work: return HttpResponseRedirect("../%s" % obj.id)        
    # this worked:   return HttpResponseRedirect("/admin/nbig/arun/99")

(请注意,nbig 是我的模型,arun 是我的应用程序)

我看到我引用的字符串已经有几年的历史了,但如果有人能告诉我如何避免这些问题,我将不胜感激。谢谢。

已编辑问题:

修改功能:

def response_add(self, request, obj, post_url_continue=None):
    return HttpResponseRedirect("../%s" % obj.id)

模型(Django 创建了 ID 主键):

class arun(models.Model):
    auser = models.CharField(max_length=15, null=True)
    more fields here
    alastcompid = models.FloatField(null=True)
    class Meta:
        verbose_name = 'NBI Graph'
        verbose_name_plural = 'NBI Graph'
    def __str__(self): 
        return str(self.id)

错误: 找不到页面 (404) 请求方法:GET 请求网址:http://127.0.0.1:8000/admin/nbig/arun/None/ 提出者:django.contrib.admin.options.change_view 主键为“无”的 NBI 图形对象不存在。 您看到此错误是因为您的 Django 设置文件中有 DEBUG = True 。将其更改为 False,Django 将显示标准 404 页面。

我保存为新代码的相关部分(这会导致问题吗?):

    def save_model(self, request, obj, form, change):
        f_id = request.POST.get('id','') 
        f_adate = datetime.now().date()     
        f_atime = datetime.now().time() 

        if '_saveasnew' in request.POST:
            aa = arun(id=f_id, adate = f_adate, atime = f_atime)
            aa.save(force_insert=True)

【问题讨论】:

  • 您是否在模型上手动指定了主键?您能否展示您的模型,以及使用 obj.id 时的完整回溯。
  • Alasdair,感谢您提供的任何帮助。我没有手动设置 id 字段。修改后的函数:def response_add(self, request, obj, post_url_continue=None): return HttpResponseRedirect("../%s" % obj.id) Model: class arun(models.Model): auser = models.CharField(max_length= 15、null=True) 这里有更多字段 alastcompid = models.FloatField(null=True) class Meta: verbose_name = 'NBI Graph' verbose_name_plural = 'NBI Graph' def __str__(self): return str(self.id)
  • 这里是错误消息:找不到页面 (404) 请求方法:GET 请求 URL:127.0.0.1:8000/admin/nbig/arun/None 引发者:django.contrib.admin.options.change_view NBI Graph 对象,主键为 'None ' 不存在。
  • edit您的问题并在此处添加代码和错误消息-格式使其更易于阅读!
  • 感谢您向我指出编辑功能。我更新了我的问题。

标签: python django


【解决方案1】:

save_model 方法要求您保存传入的 obj。您不应创建其他对象。

访问obj.id 时出现错误,因为您尚未保存obj

【讨论】:

  • Alasdair,所以当我强制保存时,我实际上是在覆盖 Django 对保存的处理并中断它与 obj.id 的连接?这就说得通了。我强制保存是因为我试图控制表单字段(我也有几个表单小部件),而且我不知道如何让管理员默认进行保存。感谢您的帮助。
  • 问题不是你在调用save(force_insert=True),问题是你保存的是一个新对象aa而不是对象obj。如果需要,您可以在保存之前更改 obj 的值,例如obj.f_adate = new_value.
  • 哦...好吧。谢谢你再次解释。我第一次完全误解了。我会试试的。
  • 强制保存后,我添加了这个:obj.id=f_id,现在它可以工作了。非常感谢您解释这一点!
  • 很高兴它可以工作,但理想情况下应该调用obj.save(),然后 Django 将为您设置 id。设置 obj.id=f_id 对我来说听起来很脆弱。
猜你喜欢
  • 2011-05-09
  • 1970-01-01
  • 2022-10-19
  • 2014-10-18
  • 2017-02-09
  • 2012-10-17
  • 2015-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多