【问题标题】:Edit form in django doesn't save record after updatedjango中的编辑表单在更新后不保存记录
【发布时间】:2018-02-22 16:38:49
【问题描述】:

我有一个小问题,我创建了一个编辑表单来更新现有记录。表单显示正确,但是当我单击编辑按钮更新记录时,重定向我的 url 和记录没有更新。 我的 views.py 负责编辑:

@login_required
def szczegoly_pracownik(request, id):
    link_pracownik = get_object_or_404(Cudzoziemiec, id=id)
    return render(request, 'cudzoziemiec/szczegoly_pracownik.html', {'link_pracownik': link_pracownik})

@login_required
def edycja_pracownika(request, id):
    link_pracownik = get_object_or_404(Cudzoziemiec, id=id)
    if request.method == 'POST':
        edycja_pracownika = CudzoziemiecForm(request.POST, instance=link_pracownik)
        if edycja_pracownika.is_valid():
            link_pracownik = edycja_pracownika.save(commit=False)
            link_pracownik.save()
            return render('szczegoly_pracownik', id=link_pracownik.id)
    else:
        edycja_pracownika = CudzoziemiecForm(request.user, instance=link_pracownik)
    return render(request, 'cudzoziemiec/edycja_pracownika.html', {'edycja_pracownika': edycja_pracownika})

def szczegoly_pracownika 负责显示详细视图

文件edycja_pracownika.html

{% if request.user.is_authenticated %}
<form action="." method="post">
    {{ edycja_pracownika.as_p }}
    {% csrf_token %}
    <div class="float-right">
    <p><input type="submit" value="Edytuj" ></p>
{% endif %}

urls.py负责详细视图和编辑视图

...
    path('pracownik/<id>', edycja_pracownika, name='edycja_pracownika'),
    path('pracownik/<id>/', szczegoly_pracownik, name='szczegoly_pracownik'),

也许有人知道错误在哪里? 编辑:

forms.py

class CudzoziemiecForm(forms.ModelForm):
    class Meta:
        model = Cudzoziemiec
        fields = ('nazwa','imie', 'nazwisko','obywatelstwo', 'data_ur','miejsce_ur','paszport','biometria', 'data_start_pasz', 'data_koniec_pasz', 'dok_pobytowy','cel_wizy', 'data_start_pobyt', 'data_koniec_pobyt')

    def __init__(self, user, *args, **kwargs):            
        super(CudzoziemiecForm, self).__init__(*args, **kwargs)
        self.fields['nazwa'].queryset = user.firma_set.all() 
        self.user = user

    def save(self, commit=True):
        instance = super(CudzoziemiecForm, self).save(commit=False)
        instance.user = self.user
        if commit:
            instance.save()
        return instance

【问题讨论】:

    标签: python django


    【解决方案1】:

    我不是来看看真正的问题,而是我会尝试一些事情。

    您对不同的页面使用相同的几乎相同的 url。这不应该是一个问题,但我认为这是一个可能的陷阱。为什么不使用 r'^pracownik/edytuj/$' 之类的东西来编辑表单? (抱歉我尝试制作波兰语网址:-))。

    也许这样可以避免可能出现的问题并有助于澄清错误。

    当你这么说的时候:

    重定向我的网址

    您的意思是您再次被重定向到表单还是详细信息页面?

    【讨论】:

    • barraquito 我已经尝试过这个解决方案,例如 url 在末尾添加 /edytuj/。之后 Django 向我返回一个关于 'edytuj' 的错误不是 int...
    • 对不起,我的错误......我的意思是r'^pracownik/&lt;id&gt;/edytuj/$'(我忘记了上一条消息中的参数)。
    • 仍然无法工作...我找不到错误,但可能有点小:)
    • 好的,让我们尝试一些重构:在else 之后,edycja_pracownika = CudzoziemiecForm(instance=link_pracownik) 不需要request.user,除非你有充分的理由。 link_pracownik = edycja_pracownika.save(commit=False) 可以省略提交并删除link_pracownik.save()(如果我们到达那里,保存将起作用)。之后,我将使用return HttpResponseRedirect(reverse('szczegoly_pracownik', args=(link_pracownik.id)) 而不是return render([..]),因为我们想在他的正确网址中显示详细信息页面。不要忘记 HttpResponseRedirect 和 reverse 的导入。
    • barraquito 你可以通过编辑我必须在我的代码中编辑的内容来写给我吗?当我删除 request.user 之后,django 返回一个错误:__init__() 缺少 1 个必需的位置参数:'user'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    相关资源
    最近更新 更多