为什么添加了unique = True后,TextField没有更新?

时间:2019-05-11 02:29:15

标签: python django

我知道如何解决我面临的问题。但问题是我不知道为什么代码会如此表现。
所以我需要有人解释为什么会发生这种情况。

我需要使用用户输入来编辑TextField并显示新的TextField,并且当CharField和TextField都更改时,它可以按预期工作,但是当仅TextField更改时,它就无法工作。顺便说一下,当仅CharField更改时,CharField被更新。

让我分享片段。这不是我在代码库中真正拥有的。


models.py

class Foo(models.Model):
    foo_name = models.CharField(max_length=100)
    foo_message = models.TextField(max_length=200)

class Bar(models.Model):
    foo = models.ForeignKey(Foo, on_delete=models.CASCADE)
    bar_name = models.CharField(max_length=100, unique=True)
    bar_message = models.TextField(max_length=200)

forms.py

class BarForm(ModelForm):
    class Meta:
        model = Bar
        fields = ["bar_name", "bar_message"]

views.py

def show_bar(request, foo_name, bar_name):
    foo = Foo.objects.get(foo_name__iexact=foo_name)
    bar = foo.bar_set.get(bar_name=bar_name)
    if request.method == "POST":
        form = BarForm(request.POST)
        if form.is_valid():
            bar.bar_name = form.cleaned_data["bar_name"]
            bar.bar_message = form.cleaned_data["bar_message"]
            bar.foo = foo
            bar.save()
            return redirect("bar-show", foo_name, bar.bar_name)
    context = {"foo": foo, "bar": bar}
    return render(request, "bar_show.html", context)

def edit_bar(request, foo_name, bar_name):
    foo = Foo.objects.get(foo_name__iexact=foo_name)
    bar = foo.bar_set.get(bar_name=bar_name)
    form = BarForm(instance=bar)
    context = {"foo": foo, "bar": bar, "form": form}
    return render(request, "bar_edit.html", context)

模板
bar_show.html

<h1>bar_name</h1>
<p>{{ bar.bar_name }}</p>
<h1>bar_message</h1>
<p>{{ bar.bar_message}}</p>
<a href="{% url 'bar-edit' foo.foo_name bar.bar_name %}">edit</a>

bar_edit.html

<form action="{% url 'bar-show' foo.foo_name bar.bar_name %}" method="post">
    {{ form.non_field_errors }}
    {% csrf_token %}
    <p>{{ form.bar_name.errors }} {{ form.bar_name }}</p>
    <p>{{ form.bar_message.errors }} {{ form.bar_message }}</p>
    <input type="submit" value="edit">
</form>

urls.py

urlpatterns = [
    path("/<str:foo_name>/<str:bar_name>/", views.show_bar, name="bar-show"),
    path("/<str:foo_name>/<str:bar_name>/edit/", views.edit_bar, name="bar-edit")
]

我希望它发生和之前真正发生的是:

  • 仅编辑bar_name =>成功编辑
  • 仅bar_message已编辑=>成功编辑
  • 两者均已编辑=>已成功编辑

这种预期的行为发生在我将unique=True添加到bar_name = models.CharField(max_length=100)之前。


现在发生的是:

  • 仅编辑bar_name =>成功编辑
  • 仅bar_message已编辑=>未成功编辑
  • 两者均已编辑=>已成功编辑

仅编辑bar_message时,已编辑的bar_message消失了,前一个bar_message显示在bar_show.html中。


要解决此问题,我要做的就是将instance=bar添加到form = BarForm(request.POST)

我知道感谢https://djangosnippets.org/snippets/1228/How to load an instance in Django ModelForms

但是我不明白的是为什么在添加unique=True之后突然发生“仅编辑bar_message =>未成功编辑”的原因。

有人可以向我解释吗?

0 个答案:

没有答案