gpt4 book ai didi

javascript - django 形成外键 'value error must be an instance'

转载 作者:行者123 更新时间:2023-11-28 00:33:05 25 4
gpt4 key购买 nike

我正在尝试使用现有数据库移植应用程序。我使用 db_column 使 django 模型外键正确,同时使用现有的数据库名称和列。

模型.py

class foo(models.Model):
foo_id = models.AutoField(primary_key=True, blank=False, null=False)
foo_name = models.CharField(max_length=500, blank=True, null=True)
foo_type_lookup = models.ForeignKey('foo_type_lookup', to_field="foo_type_id", db_column="foo_type", blank=True, null=True)

class foo_type_lookup(models.Model):
foo_type_id = models.AutoField(primary_key=True, blank=False, null=False)
foo_type = models.CharField(max_length=500, blank=False, null=False)

表 foo_type_lookup 有两行(id 0 和 1),分别表示 foo_type 'bar' 和 'baz'。我正在尝试制作一个表单来在 foo 表中添加一条记录,该记录将具有 foo_type_lookup 的外键。 Foo 可以是 bar 或 baz。

View .py

   def add_foo(request):
action = '#'
errors = None
if request.method == 'POST':
form = FooForm(request.POST)

if form.is_valid():

form.save(commit=True)

return home(request)
else:
# The supplied form contained errors - just print them to the terminal.
errors = form.errors
else:
# If the request was not a POST, display the form to enter details.
form = FooForm()

# Bad form (or form details), no form supplied...
# Render the form with error messages (if any).
return render(request, 'foo/add_foo.html', {'form' : form, 'errors' : errors, 'action' : action})

表单.py

CONTACT_FOO_CHOICES = [[0,'Bar'],[1,'Baz']]

class FooForm(forms.ModelForm):
foo_type_lookup = forms.ChoiceField(widget=RadioSelect(), choices=CONTACT_FOO_CHOICES)
foo_name = forms.CharField(label='First Name', max_length=500, required=False)

class Meta:
model = foo

fields = ('foo_name','foo_type_lookup')

我必须迭代模板中的表单对象,以便在单选按钮更改时添加 jQuery 函数。我发现这很笨重,但我不确定是否有更 django 的方法来完成此任务:

add_foo.html

<h2>add_foo.html</h2>
<form action="{{action}}" method="post" role="form">
{% csrf_token %}
{% for field in form %}
{% if field.auto_id = 'id_foo_type_lookup' %}
{% for choice in form.foo_type_lookup.field.choices %}
<li>
<label for="id_{{ field.html_name }}_{{ forloop.counter0 }}">
<input type="radio"
id="id_{{ field.html_name }}_{{ forloop.counter0 }}"
value="{{ choice.0 }}"
{% if choice.0 == '0' %}
checked="true"
{% endif %}
name="{{ field.html_name }}"
onchange="someFunction('id_{{ field.html_name }}_{{ forloop.counter0 }}')"/>
{{ choice.1 }}
</label>
</li>
{% endfor %}
{% else %}
<div class="formfield_err">{{ field.help_text }}</div>
<div id="{{ field.auto_id }}_container" >
<div class="formfield_divlbl">{{ field.label_tag }}
</div>
<div class="formfield_divfld">{{ field }}
{% if field.field.required %}
<span class="required">*</span>
{% endif %}
</div>
<div id="{{ field.auto_id }}_errors">{{ field.errors }}
</div>
</div><div class="clear" style="margin-bottom:12px;"></div>
{% endif %}
{% endfor %}

<input type="submit" value="Submit" />
</form>

我收到错误:

无法分配“'0'”:“foo.foo_type_lookup”必须是“foo_type_lookup”实例。

如何布局类型查找的单选按钮以添加 onchange javascript 并为我的 ModelForm 提供“foo_type_lookup”对象,以便将数据保存到数据库?

最佳答案

ChoiceField 不知道它需要将提供的值强制到特定的模型实例。

改用ModelChoiceField

https://docs.djangoproject.com/en/1.7/ref/forms/fields/#modelchoicefield

哎哟,看来您需要一些非常具体的显示逻辑来将值硬编码到Python中,这可能不一定等于相关模型的字符串表示形式。

如果是这样,请覆盖您的表单 save 以在通过 super 调用真正的保存之前应用任何强制。

您还可以通过commit=False手动应用任何Python逻辑(我注意到您已经将该语句设置为True,也许您正在考虑这个想法。)

obj = form.save(commit=false)
obj.foo_lookup_type = MyObject.objects.get(pk=form.cleaned_data['foo_lookup_type'])
obj.save()

关于javascript - django 形成外键 'value error must be an instance',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28771926/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com