django-ajax选择应用程序:如果在数据库中还没有创建新对象,该怎么做? [英] django-ajax-selects app: How do I create a new object when there isn't already one in the database?

查看:137
本文介绍了django-ajax选择应用程序:如果在数据库中还没有创建新对象,该怎么做?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 django-ajax-chosen ,这是一个免费的django应用程序提供jquery自动完成功能。



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

  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合作伙伴(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是相同的,除了gender = MALE):

  class FemaleLookup(object):

def get_query (self,q,request):
返回一个查询集如果需要,也可以访问request.user$
返回Skater.objects.filter(Q(gender = FEMALE)& (Q(name__istartswith = q)| Q(surname__istartswith = q)))

def format_item(self,skater):
当对象显示在所选对象的列表
return unicode(skater)

def format_result(self,skater):
一个更详细的显示,用于搜索结果显示。可能包含html和多行
return%s< br /> %unicode(skater)

def get_objects(self,ids):
给出了一个ids列表,返回在管理页面上按需要排序的对象
这是用于显示当前选择的项目(在ManyToMany字段的情况下)

返回Skater.objects.filter(pk__in = ids).order_by('name','surname ')


解决方案

AutoCompleteSelectField保存对象的ID,而不是文本,这就是为什么我一直有必需错误(为什么丹尼尔的解决方案不起作用)。值变量为空,因为不存在的Skater没有ID。



我不知道这是最好的做法,但是我最终使用AutoCompleteField而不是AutoCompleteSelectField。 AutoCompleteField保存文本,但不会为我创建一个Skater对象。



代码:



<$ p $
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]中的i:
name [i],surname [i] = get_name_surname(partners [i])
partners = [无,无]
partners_created = [无,无]
gender = [FEMALE, MALE] [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],

返回合作伙伴


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')

解决方案

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:

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

这篇关于django-ajax选择应用程序:如果在数据库中还没有创建新对象,该怎么做?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆