Django - 编辑已经存在的对象?

时间:2017-01-04 04:04:25

标签: django django-models django-views

我想编辑记录时遇到问题。

它确实编辑了所有内容,但是尝试添加get_or_create,因此如果存在不创建,但它没有按预期工作。

有人能帮助我吗?

def edit(request, id):
    models = [hotel, person]
    for model in models:
        try:
            instance = model.objects.get(id=id)
            if instance == hotel.objects.get(id=id):
                form = hotelForm(request.POST or None, instance=instance)
                if form.is_valid():
                    obj, created = hotel.objects.get_or_create(name=name)
                    if not created:
                        messages.error(request, 'error. Already exists')
                    else:
                        form.save()
                        messages.success(request, 'Success!')
                        return redirect('/')
        except:
            try:
                if instance == person.objects.get(id=id):
                    form = personForm(request.POST or None, instance=instance)
                    if form.is_valid():
                        form.save()
                        messages.success(request, 'Sucess!')
                        return redirect('/')
            except:
                pass

    return render(request , "edit.html", {'form': form})

请注意: 我的模型person在没有get_or_create的情况下正常工作,但如果我想在第一个模型hotel中添加它,它就无法工作。

如何让它按预期工作?

1 个答案:

答案 0 :(得分:3)

您的代码在几个方面没有意义。我将从最危险的

开始
       try:

       except:
            pass

永远不要这样做。您必须始终捕获特定的异常并单独处理每个异常。在罕见的情况下,如果您别无选择,只能通过一个语句捕获所有异常,绝对必须记录它,以便您了解代码中发生的情况。

第二个主要问题是:

models = [hotel, person]
    for model in models:
        ...
    if instance == hotel.objects.get(id=id):
        ...
    if instance == person.objects.get(id=id):

您假设酒店和对象具有相同的ID。一旦进入一个蓝色的月亮,你可能会得到这样一对纯粹的巧合。酒店和人的主要钥匙彼此完全没有关系。