django-ajax-selects 应用程序:当数据库中还没有一个新对象时,如何创建一个新对象?
我正在使用 django-ajax-selects,它是免费提供的django 应用程序提供 jquery 自动完成功能。
我已经让它工作了 - 即它正在自动完成我想要的表单字段。但我有一个问题...我在 ModelForm 中使用它,它将 Partnership 对象添加到数据库中:
class Skater(models.Model):
name = models.CharField(max_length=64)
surname = models.CharField(max_length=64)
gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
class Partnership(models.Model):
female_partner = models.ForeignKey(Skater, limit_choices_to = {'gender': FEMALE}, related_name='female_partner_set')
male_partner = models.ForeignKey(Skater, limit_choices_to = {'gender': MALE}, related_name='male_partner_set')
我希望用户能够将姓名放入 Female_partner 和male_partner 字段,即使 Skater 对象如该对象不存在,我希望创建该对象。我该怎么做呢?我无法将代码放入表单的保存方法中,因为该字段无法验证(它不是有效的 Skater)。
编辑1: 添加更多代码...
形式:
class PartnershipAddForm(forms.ModelForm):
female_partner = AutoCompleteSelectField('female_skater',required=True)
male_partner = AutoCompleteSelectField('male_skater',required=True)
class Meta:
model = Partnership
settings.py:
AJAX_LOOKUP_CHANNELS = {
'female_skater' : ('skaters.lookups', 'FemaleLookup'),
'male_skater' : ('skaters.lookups', 'MaleLookup'),
}
lookups.py(MaleLookup 相同,只是性别=MALE):
class FemaleLookup(object):
def get_query(self,q,request):
""" return a query set. you also have access to request.user if needed """
return Skater.objects.filter(Q(gender=FEMALE) & (Q(name__istartswith=q) | Q(surname__istartswith=q)))
def format_item(self,skater):
""" simple display of an object when it is displayed in the list of selected objects """
return unicode(skater)
def format_result(self,skater):
""" a more verbose display, used in the search results display. may contain html and multi-lines """
return "%s<br/>" % unicode(skater)
def get_objects(self,ids):
""" given a list of ids, return the objects ordered as you would like them on the admin page.
this is for displaying the currently selected items (in the case of a ManyToMany field)
"""
return Skater.objects.filter(pk__in=ids).order_by('name','surname')
I'm using django-ajax-selects, which is a freely available django app providing jquery autocomplete functionality.
I've got it working - i.e. it is autocompleting the form fields I want it to. But I have a problem... I'm using it in a ModelForm which adds Partnership objects to the database:
class Skater(models.Model):
name = models.CharField(max_length=64)
surname = models.CharField(max_length=64)
gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
class Partnership(models.Model):
female_partner = models.ForeignKey(Skater, limit_choices_to = {'gender': FEMALE}, related_name='female_partner_set')
male_partner = models.ForeignKey(Skater, limit_choices_to = {'gender': MALE}, related_name='male_partner_set')
I want the user to be able to put in a name and surname into the female_partner and male_partner field even if a Skater object like that doesn't exist and I want that object created. How do I go about doing this? I cannot put the code in the form's save method because the field won't validate (it's not a valid Skater).
EDIT 1:
Adding in more code...
The form:
class PartnershipAddForm(forms.ModelForm):
female_partner = AutoCompleteSelectField('female_skater',required=True)
male_partner = AutoCompleteSelectField('male_skater',required=True)
class Meta:
model = Partnership
settings.py:
AJAX_LOOKUP_CHANNELS = {
'female_skater' : ('skaters.lookups', 'FemaleLookup'),
'male_skater' : ('skaters.lookups', 'MaleLookup'),
}
lookups.py (MaleLookup is the same except that gender=MALE):
class FemaleLookup(object):
def get_query(self,q,request):
""" return a query set. you also have access to request.user if needed """
return Skater.objects.filter(Q(gender=FEMALE) & (Q(name__istartswith=q) | Q(surname__istartswith=q)))
def format_item(self,skater):
""" simple display of an object when it is displayed in the list of selected objects """
return unicode(skater)
def format_result(self,skater):
""" a more verbose display, used in the search results display. may contain html and multi-lines """
return "%s<br/>" % unicode(skater)
def get_objects(self,ids):
""" given a list of ids, return the objects ordered as you would like them on the admin page.
this is for displaying the currently selected items (in the case of a ManyToMany field)
"""
return Skater.objects.filter(pk__in=ids).order_by('name','surname')
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
AutoCompleteSelectField 保存对象的 ID 而不是文本,这就是为什么我一直遇到“必需”错误的原因(以及 Daniel 的解决方案不起作用的原因)。 value 变量为空,因为不存在的 Skater 没有 id。
我不确定这是最好的方法,但我最终使用 AutoCompleteField 而不是 AutoCompleteSelectField。 AutoCompleteField 保存文本,但它不会为我创建 Skater 对象。
代码:
AutoCompleteSelectField holds the id of the object rather than the text, which is why I had the "required" error all along (and why Daniel's solution doesn't work). The value variable was empty as a Skater that doesn't exist doesn't have an id.
I'm not sure this is the best way of doing this, but I ended up using AutoCompleteField instead of AutoCompleteSelectField. AutoCompleteField holds text, but it doesn't create a Skater object for me.
The code:
看起来您需要从 ajax-selects 继承 AutoCompleteSelectField 并重写其
clean
方法。It looks like you need to subclass AutoCompleteSelectField from ajax-selects and override its
clean
method.我们可以看看你的表格是什么样子的吗?我认为你需要重写 ModelForm 中的 save() 方法,这样它首先保存 Female_partner 和male_partner,然后保存表单实例(又名 Parntership 实例)。
Could we see what your form looks like? I think you need to so something like override the save() method in your ModelForm, so it saves the female_partner and male_partner first, then saves the form instance (aka Parntership instance).