【问题标题】:select object to edit选择要编辑的对象
【发布时间】:2010-12-29 03:47:30
【问题描述】:

我有一个简单的视图函数,旨在允许用户从 html 表(记录)中列出的项目中进行选择。单击记录应将用户转移到可以编辑该特定记录的模板。代码如下:

def edit_record(request):
        if request.method == 'POST':
                a=ProjectRecord.objects.get()
                form = RecordForm(request.POST, instance=a)
                if form.is_valid():
                        form.save()
                        return HttpResponseRedirect('/')
        else:
                a=ProjectRecord.objects.get()
                form = RecordForm(instance=a)
        return render_to_response('productionModulewire.html', {'form': form})

问题在于,只要数据库中只有 1 条记录,该功能就可以完美运行。一旦我添加另一个,我就会收到一个多次返回的项目错误。 我怀疑它与“objects.get()”有关,但我不知道如何正确构建视图?

网址很简单(也许太多了):

(r'^edit/', edit_record),

模型看起来像这样:

class ProjectRecord(models.Model): 
    client = models.CharField(max_length=50, choices=CLIENT_CHOICES)
    account = models.CharField(max_length=50, choices=ACCOUNT_CHOICES)
    project_type = models.CharField(max_length=50, choices=TYPE_CHOICES)
    market = models.CharField(max_length=50, choices=MARKET_CHOICES)
    agencyID = models.CharField(max_length=30, unique=True, blank=True, null=True)
    clientID = models.CharField(max_length=30, unique=True, blank=True, null=True)
    prjmanager = models.CharField(max_length=64, unique=False, blank=True, null=True)
    acclead = models.CharField(max_length=64, unique=False, blank=True, null=True)
    artdirector = models.CharField(max_length=64, unique=False, blank=True, null=True)
    prdlead = models.CharField(max_length=64, unique=False, blank=True, null=True)
    intlead = models.CharField(max_length=64, unique=False, blank=True, null=True)
    prjname = models.CharField(max_length=200, unique=True)
    prjstatus = models.CharField(max_length=50, choices=STATUS_CHOICES)
    as_of = models.DateField(auto_now_add=False)
    format = models.CharField(max_length=64, unique=False, blank=True, null=True)
    target_studio = models.DateField(unique=False, blank=True, null=True)
    mech_return = models.DateField(unique=False, blank=True, null=True)
    comp_return = models.DateField(unique=False, blank=True, null=True)
    target_release = models.DateField(unique=False, blank=True, null=True)
    record_added = models.DateField(auto_now_add=True)
    record_modified = models.DateTimeField()
    studio_name = models.CharField(max_length=64, unique=False, blank=True, null=True)
    studio_process = models.CharField(max_length=64, unique=False, blank=True, null=True, choices=PROCESS_CHOICES)
    to_studio = models.DateTimeField(unique=False, blank=True, null=True)
    from_studio = models.DateTimeField(unique=False, blank=True, null=True)
    studio_name2 = models.CharField(max_length=64, unique=False, blank=True, null=True)
    studio_process2 = models.CharField(max_length=64, unique=False, blank=True, null=True, choices=PROCESS_CHOICES)
    to_studio2 = models.DateTimeField(unique=False, blank=True, null=True)
    from_studio2 = models.DateTimeField(unique=False, blank=True, null=True)
    comments = models.TextField(max_length=500, unique=False, blank=True, null=True)
    summary = models.TextField(max_length=500, unique=False, blank=True, null=True)
    upload_pdf = models.CharField(max_length=50, unique=False, blank=True, null=True)
    upload_achive = models.CharField(max_length=50, unique=False, blank=True, null=True)

    def __unicode__(self):
        return u'%s' % self.prjname

    class Admin: 
        pass

模型表单“RecordForm”的来源。

【问题讨论】:

  • 内置管理界面完全自动为您完成此操作,无需编写任何代码。当您已经在管理界面中正常工作时,为什么还要自己编写此事务?
  • 因为我正在尝试为大量最终用户定制环境。例如,这个特定的记录数据库将只是用户可以调用的许多“独立”模块中的一个。提议的功能要求用户能够同时打开和处理多个“模块”。

标签: python django django-views


【解决方案1】:

get 的重要之处在于“得到什么?”

当你说

a=ProjectRecord.objects.get()

您忽略了提供任何选择标准。您想从数据库中获取哪一行?

哪一行?嗯……GET 事务如何知道要编辑哪一行?

通常,我们将其放在 URL 中。

因此,您需要更新您的 urls.py 以在 URL 路径中包含记录 ID。您需要更新视图函数定义以接受此记录 ID。最后,您需要更新 GET 和 POST 以使用来自 URL 的记录标识。


更新 urls.py 以包含对象 ID。见http://docs.djangoproject.com/en/1.1/topics/http/urls/#named-groups

urlpatterns = patterns('',
    (r'^class/(?P<object_id>\d+?)/$', 'app.views.edit_record'),

更新你的视图函数

def edit_record( request, object_id = None ):
    if request.method == "POST":
        if object_id is None:
            return Http_404
        ProjectRecord.objects.get( pk = int(object_id) )

    etc.

【讨论】:

  • 不知道如何通过 url 传递值(我知道......该死的新手 :-)。在该领域进行的一项小研究产生了黄金!感谢你的帮助。非常感谢。
  • @kjarsenal:一定要接受对你有帮助的答案之一。
  • 我刚刚点击了左上角的复选标记。我认为这就是我们所要求的。谢谢。
  • @kjarsenal:该网站有一个非常好的常见问题解答,它解释了它的工作原理以及为什么这对像您这样想要问题答案的人有利。考虑一下花在阅读常见问题解答上的时间可能对您很有价值。
【解决方案2】:

如果没有更多信息,很难说出您需要更改什么,但您的猜测是正确的,问题出在您的ProjectRecord.objects.get() 电话上。

您应该传递某种信息以将列表限制为一个。

在大多数情况下,您需要:

ProjectRecord.objects.get(pk=id)  

其中id 是您尝试编辑的ProjectRecord 的主键值。

您能否展示您的urls.py 中的相关代码以及您的ProjectRecord 模型的更多信息?

【讨论】:

  • 感谢大家的帮助。我编辑了原始帖子,使其包含更多代码。希望对您有所帮助。
猜你喜欢
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
相关资源
最近更新 更多