我知道如何解决我面临的问题。但问题是我不知道为什么代码会如此表现。
所以我需要有人解释为什么会发生这种情况。
我需要使用用户输入来编辑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")
]
我希望它发生和之前真正发生的是:
这种预期的行为发生在我将unique=True
添加到bar_name = models.CharField(max_length=100)
之前。
现在发生的是:
仅编辑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 =>未成功编辑”的原因。
有人可以向我解释吗?