django-autocomplete-light 默认加载以前保存的值?
Posted
技术标签:
【中文标题】django-autocomplete-light 默认加载以前保存的值?【英文标题】:django-autocomplete-light default load a previously saved value? 【发布时间】:2014-01-22 11:56:42 【问题描述】:我在我的 django 项目中有一个 autocomplete_light 的工作实现,在下拉列表中从 city_light 中提取值,从而在表单提交时正确地将外键保存到数据库中的字段。当我重新访问表单时,我希望自动完成文本字段默认为保存的值,理想情况下使用纯文本中的值和“X”按钮(就像已经内置的那样)。目前,我看到占位符文本和空白文本字段。当我重新访问表单时,表单中的其他保存值(此处省略)被正确默认。我需要在此处添加什么来触发小部件以显示保存的值?这是我的代码:
forms.py
class UserProfileForm(autocomplete_light.GenericModelForm):
location = autocomplete_light.GenericModelChoiceField(
widget=autocomplete_light.ChoiceWidget(
autocomplete='AutocompleteItems',
autocomplete_js_attributes='placeholder':'City, State, Country',
'minimum_characters': 3)
)
class Meta:
model = UserProfile
fields = ['location']
models.py
class UserProfile(models.Model):
user = models.ForeignKey(
User,
unique=True
)
location = models.ForeignKey(
City,
blank=True,
null=True
)
autocomplete_light_registry.py
class AutocompleteItems(autocomplete_light.AutocompleteGenericBase):
choices = (
City.objects.all(),
)
search_fields = (
('search_names',),
)
autocomplete_light.register(AutocompleteItems)
【问题讨论】:
这不会很好地工作,这就是为什么 django-autocomplete-light 不提供这样的功能。在某些情况下,您只是无法保持文本字段与隐藏 pk 中的实际值之间的同步。我现在不能花时间解释所有事情,但是您可以通过尝试计划您的实现如何在纸上工作来弄清楚。作为 django-autocomplete-light 的作者,我不知道为什么你被否决了,所以我要投赞成票来补偿。但是,您应该尝试 django-autocomplete-light v2,它的设计更像您所说的。 【参考方案1】:我知道这篇文章已有 1 年多的历史了,但答案可能会对某人有所帮助。我设法通过在表单 init 中将 extra_context 参数添加到 ChoiceWidget 来填充 autocomplete-light 小部件。
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
if self.initial.get('city', None):
cityPK = self.initial['city']
city = cities_light.models.City.objects.get(pk=cityPK)
self.fields['city_name'].widget=autocomplete_light.ChoiceWidget('CityAutocomplete', extra_context='values':[cityPK], 'choices':[city])
【讨论】:
以上是关于django-autocomplete-light 默认加载以前保存的值?的主要内容,如果未能解决你的问题,请参考以下文章
django-autocomplete-light 简单用法
使用 django-autocomplete-light 自动完成
Django:django-autocomplete-light 无法正常工作
如何使用 django-autocomplete-light