有一位用户使用 Django 模型表单来允许用户更新他们之前上传到网站的卡组信息,然而遇到了一个问题,即清洗后的数据返回为 unicode 字符串。例如,如果用户输入 “Deck Foo” 作为名称,它在数据库中会被记录为 (u’Deck Foo’,)。这位用户在网站上还有大约 10 个其他模型表单,它们都工作正常,而这个表单与其他表单之间没有明显的区别。
以下是这位用户提供的代码示例:
forms.py
class DeckForm(forms.ModelForm):
class Meta:
model = Deck
fields = ['name',
'format',
'type',
'packs',
'deck_list',
'is_active']
def clean(self):
if self.cleaned_data['type'] == 'COMMANDER' and self.cleaned_data['format'] != 'VINTAGE':
raise forms.ValidationError('Commander is only played in vintage format.')
return self.cleaned_data
views.py
def deck_detail(request,
deck_slug,
template_name="deck/deck_detail.html"
):
deck = Deck.objects.get(slug=deck_slug)
if request.method == 'POST':
form = DeckForm(request.POST, instance=deck)
if form.is_valid():
name = form.cleaned_data['name']
format = form.cleaned_data['format']
type = form.cleaned_data['type']
packs = form.cleaned_data['packs']
deck_list = form.cleaned_data['deck_list']
is_active = form.cleaned_data['is_active']
deck.name = name,
deck.slug = slugify(name),
deck.format = format,
deck.type = type,
deck.packs = packs,
deck.deck_list = deck_list,
deck.is_active = is_active
deck.save()
return HttpResponseRedirect('/deck/'+deck.slug)
else:
form = DeckForm(instance=deck)
html
<form action="/deck/{{deck.slug}}/" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit Deck" />
</form>
2、解决方案
从这位用户的描述中,我们知道他将 deck.name
赋值成了一个包含单个 unicode 元素的元组 (u'Deck Foo',)
. 这导致了 unicode 字符串被存储为元组,而不是普通字符串。为了解决这个问题,只需要将 deck.name
赋值成 name
,而无需使用逗号即可。
修改后的代码如下:
views.py
def deck_detail(request,
deck_slug,
template_name="deck/deck_detail.html"
):
deck = Deck.objects.get(slug=deck_slug)
if request.method == 'POST':
form = DeckForm(request.POST, instance=deck)
if form.is_valid():
name = form.cleaned_data['name']
format = form.cleaned_data['format']
type = form.cleaned_data['type']
packs = form.cleaned_data['packs']
deck_list = form.cleaned_data['deck_list']
is_active = form.cleaned_data['is_active']
deck.name = name # 移除逗号
deck.slug = slugify(name),
deck.format = format,
deck.type = type,
deck.packs = packs,
deck.deck_list = deck_list,
deck.is_active = is_active
deck.save()
return HttpResponseRedirect('/deck/'+deck.slug)
else:
form = DeckForm(instance=deck)
通过移除 deck.name
赋值中的逗号,即可将 name
变量的值直接赋值给 deck.name
,从而将其存储为普通的 unicode 字符串,而不是元组。