gpt4 book ai didi

Django 表单未使用 ModelChoiceField 保存 -foreignkey

转载 作者:行者123 更新时间:2023-12-02 06:42:57 24 4
gpt4 key购买 nike

我的网站上有多个表单,可以将信息保存到我的 PostgreSQL 数据库中。我正在尝试创建一个表单来保存我的集合模型的信息:

class Set(models.Model):
settitle = models.CharField("Title", max_length=50)
setdescrip = models.CharField("Description", max_length=50)
action = models.ForeignKey(Action)
actorder = models.IntegerField("Order number")

设置形式如下所示。我正在使用 ModelChoiceField 从操作模型中提取操作名称字段列表,这在表单上显示为选择下拉列表

class SetForm(ModelForm):

class Meta:
model = Set
fields = ['settitle', 'setdescrip', 'action', 'actorder']
action = forms.ModelChoiceField(queryset = Action.objects.values_list('name', flat=True), to_field_name="id")

createset 的 View 如下:

def createset(request):
if not request.user.is_authenticated():
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
elif request.method == "GET":
#create the object - Setform
form = SetForm;
#pass into it
return render(request,'app/createForm.html', { 'form':form })
elif "cancel" in request.POST:
return HttpResponseRedirect('/actions')
elif request.method == "POST":
# take all of the user data entered to create a new set instance in the table
form = SetForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return HttpResponseRedirect('/actions')
else:
form = SetForm()
return render(request,'app/createForm.html', {'form':form})

当表单填写完毕且有效并按下“保存”后,没有任何反应。没有错误,页面只是刷新为新表单。如果我没有使用 (action = forms.ModelChoiceField(queryset = Action.objects.values_list('name', flat=True), to_field_name="id")) 在 forms.py 中设置操作字段,则数据将保存,所以这很可能是我做错的地方。只是不确定什么?

最佳答案

https://docs.djangoproject.com/en/stable/ref/forms/fields/#django.forms.ModelChoiceField.queryset

queryset 属性应该是一个查询集。 values_list 返回一个列表。

您应该只定义 Action 模型的 __str__ 方法,而不必重新定义表单中的操作字段。

如果已设置并且您想使用另一个标签,则可以子类化 ModelChoiceField。

The __str__ (__unicode__ on Python 2) method of the model will be called to generate string representations of the objects for use in the field’s choices; to provide customized representations, subclass ModelChoiceField and override label_from_instance. This method will receive a model object, and should return a string suitable for representing it. For example:

from django.forms import ModelChoiceField

class MyModelChoiceField(ModelChoiceField):
def label_from_instance(self, obj):
return "My Object #%i" % obj.id

因此,在您的情况下,要么设置 Action 模型的 __str__ 方法,然后删除 action = forms.ModelChoiceField(...) 表单中的行:

class Action(models.Model):
def __str__(self):
return self.name

class SetForm(ModelForm):

class Meta:
model = Set
fields = ['settitle', 'setdescrip', 'action', 'actorder']

或者定义自定义 ModelChoiceField:

class MyModelChoiceField(forms.ModelChoiceField):
def label_from_instance(self, obj):
return obj.name

class SetForm(ModelForm):

class Meta:
model = Set
fields = ['settitle', 'setdescrip', 'action', 'actorder']

action = MyModelChoiceField(Action.objects.all())

关于Django 表单未使用 ModelChoiceField 保存 -foreignkey,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36117180/

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