Django 表单无法从 db 获取最新信息
Django forms don't get up-to-date from db
我有打印来自 table 的所有记录的表格(可以说它在数据库中的 'item' table)。用户可以使用 ajax 将新项目添加到数据库。数据正确保存到数据库,但是当我刷新页面时,我在多 select 框中看不到新标签。
我认为缓存是个问题,但事实并非如此。
所以我有一个问题:我可以看到正确添加记录的问题在哪里但是当我刷新同一页面时每次 select 来自 table 的所有行然后我看不到这些新记录?
我正在使用 sqlite,它是开发服务器。
Forms.py:
BLANK_CHOICE = (('', '---------'),)
class OrderCreateForm(forms.ModelForm):
tag_from = forms.MultipleChoiceField(label='Tags', choices=OrderItemList.objects.all().values_list('id', 'name'))
tag_to = forms.MultipleChoiceField()
class Meta:
model = Order
fields = ('price', 'client', 'platform')
def __init__(self, request_client_id, *args, **kwargs):
super(OrderCreateForm, self).__init__(*args, **kwargs)
self.fields['platform'].choices = BLANK_CHOICE + tuple(
Platform.objects.filter(client_id=request_client_id).values_list('id', 'name'))
View.py:
@user_passes_test(lambda u: u.is_staff, login_url='/account/login/')
def order_create(request, request_client_id):
dict = {}
dict['form_order'] = OrderCreateForm(request_client_id)
return render(request, 'panel/order/form.html', dict)
问题是您在字段定义中设置了 tag_from
选项,因此当表单首次加载时选项会被评估一次。您可以通过在 __init__
方法中设置选项来解决此问题。
class OrderCreateForm(forms.ModelForm):
tag_from = forms.MultipleChoiceField(label='Tags', choices=())
...
def __init__(self, request_client_id, *args, **kwargs):
super(OrderCreateForm, self).__init__(*args, **kwargs)
self.fields['tag_from'].choices = OrderItemList.objects.all().values_list('id', 'name'))
...
另一种选择是使用 ModelMultipleChoiceField
而不是常规的多项选择字段。使用模型多选字段,Django 将在每次初始化表单时评估查询集。
class OrderCreateForm(forms.ModelForm):
tag_from = forms.MultipleChoiceField(label='Tags', queryset=OrderItemList.objects.all())
我有打印来自 table 的所有记录的表格(可以说它在数据库中的 'item' table)。用户可以使用 ajax 将新项目添加到数据库。数据正确保存到数据库,但是当我刷新页面时,我在多 select 框中看不到新标签。
我认为缓存是个问题,但事实并非如此。
所以我有一个问题:我可以看到正确添加记录的问题在哪里但是当我刷新同一页面时每次 select 来自 table 的所有行然后我看不到这些新记录?
我正在使用 sqlite,它是开发服务器。
Forms.py:
BLANK_CHOICE = (('', '---------'),)
class OrderCreateForm(forms.ModelForm):
tag_from = forms.MultipleChoiceField(label='Tags', choices=OrderItemList.objects.all().values_list('id', 'name'))
tag_to = forms.MultipleChoiceField()
class Meta:
model = Order
fields = ('price', 'client', 'platform')
def __init__(self, request_client_id, *args, **kwargs):
super(OrderCreateForm, self).__init__(*args, **kwargs)
self.fields['platform'].choices = BLANK_CHOICE + tuple(
Platform.objects.filter(client_id=request_client_id).values_list('id', 'name'))
View.py:
@user_passes_test(lambda u: u.is_staff, login_url='/account/login/')
def order_create(request, request_client_id):
dict = {}
dict['form_order'] = OrderCreateForm(request_client_id)
return render(request, 'panel/order/form.html', dict)
问题是您在字段定义中设置了 tag_from
选项,因此当表单首次加载时选项会被评估一次。您可以通过在 __init__
方法中设置选项来解决此问题。
class OrderCreateForm(forms.ModelForm):
tag_from = forms.MultipleChoiceField(label='Tags', choices=())
...
def __init__(self, request_client_id, *args, **kwargs):
super(OrderCreateForm, self).__init__(*args, **kwargs)
self.fields['tag_from'].choices = OrderItemList.objects.all().values_list('id', 'name'))
...
另一种选择是使用 ModelMultipleChoiceField
而不是常规的多项选择字段。使用模型多选字段,Django 将在每次初始化表单时评估查询集。
class OrderCreateForm(forms.ModelForm):
tag_from = forms.MultipleChoiceField(label='Tags', queryset=OrderItemList.objects.all())