首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django-ajax-selects :当数据库中还没有一个新对象时,我如何创建一个新对象?

django-ajax-selects :当数据库中还没有一个新对象时,我如何创建一个新对象?
EN

Stack Overflow用户
提问于 2010-01-24 21:30:44
回答 3查看 1.9K关注 0票数 4

我使用的是django-ajax-选择,它是一个免费提供jquery自动完成功能的django应用程序。

我已经让它工作了-也就是说,它是自动完成我想要它的表单字段。但我有个问题..。我在ModelForm中使用它,它将伙伴关系对象添加到数据库中:

代码语言:javascript
复制
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字段中输入名称和姓氏,即使这样的滑板对象不存在,我希望创建该对象。我该怎么做呢?我不能将代码放入表单的保存方法中,因为字段不会验证(它不是有效的滑板者)。

编辑1:添加更多代码..。

表格:

代码语言:javascript
复制
class PartnershipAddForm(forms.ModelForm):
    female_partner = AutoCompleteSelectField('female_skater',required=True)
    male_partner = AutoCompleteSelectField('male_skater',required=True)

    class Meta:
        model = Partnership

settings.py:

代码语言:javascript
复制
AJAX_LOOKUP_CHANNELS = {
    'female_skater' : ('skaters.lookups', 'FemaleLookup'),
    'male_skater' : ('skaters.lookups', 'MaleLookup'),
}

lookups.py (MaleLookup是相同的,但gender=MALE除外):

代码语言:javascript
复制
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')
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-01-31 14:09:23

AutoCompleteSelectField保存的是对象的id,而不是文本,这就是为什么我一直存在“必需”错误(以及Daniel的解决方案无法工作)。值变量是空的,因为不存在的溜冰者没有id。

我不确定这是最好的方法,但我最终使用的是AutoCompleteField而不是AutoCompleteSelectField。AutoCompleteField保存文本,但它不会为我创建一个滑板对象。

守则:

代码语言:javascript
复制
class PartnershipAddForm(forms.ModelForm):
    female_partner = AutoCompleteField('female_skater',required=True)
    male_partner = AutoCompleteField('male_skater',required=True)

    class Meta:
        model = Partnership

    def save(self):
        partners = [self.cleaned_data['female_partner'],
                    self.cleaned_data['male_partner']]
        name = ['','']
        surname = ['','']
        for i in [0,1]:
            name[i],surname[i] = get_name_surname(partners[i])
        partners = [None,None]
        partners_created = [None,None]
        gender = [FEMALE,MALE]
        for i in [0,1]:        
            partners[i],partners_created[i] = Skater.objects.get_or_create(
                                            name=name[i],
                                            surname=surname[i],
                                            gender=gender[i]
                                        )

         partnership, created = Partnership.objects.get_or_create(
                                    female_partner=partners[0],
                                    male_partner=partners[1],
                                )
         return partnership
票数 4
EN

Stack Overflow用户

发布于 2010-01-29 21:43:02

看起来您需要从ajax中子类AutoCompleteSelectField -选择并覆盖它的clean方法。

代码语言:javascript
复制
def clean(self, value):
    if value:
        lookup = get_lookup(self.channel)
        objs = lookup.get_objects( [value] )
        if objs:
            return objs[0]
        else:
            firstname, surname = value.split(" ")
            gender = self.channel.split("_")[0]
            new_skater = Skater(name=firstname, surname=surname, gender=gender)
            return new_skater
    else:
        if self.required:
            raise forms.ValidationError(self.error_messages['required'])
        return None
票数 2
EN

Stack Overflow用户

发布于 2010-01-24 21:45:09

我们能看看你的表格是什么样子吗?我认为您需要在ModelForm中重写save()方法,因此它首先保存female_partner和male_partner,然后保存表单实例(也称为Parntership实例)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2128947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档