2016-06-07 89 views
0

我想建立一个类似的,但显著简单的用户列表页面查询过滤器菜单:Django的查询过滤器菜单

Player List from nhl.com

用户可以申请单独的过滤器,或者把它们。我更喜欢AJAX,但很高兴开始使用“应用过滤器”提交按钮。

Current look

class User(AbstractBaseUser): 
id = models.AutoField(primary_key=True) 
created = models.DateTimeField(auto_now_add=True, null=True, blank=True) 
modified = models.DateTimeField(auto_now=True, null=True, blank=True) 

first_name = models.CharField(max_length=50) 
last_name = models.CharField(max_length=50) 
email = models.EmailField(verbose_name='email address', max_length=255, unique=True,) 

date_of_birth = models.DateField('date of birth', null=True) 
avatar = models.ImageField('profile picture', upload_to='static/images/avatars/', null=True, blank=True) 
logline = models.CharField(max_length=100, blank=True) 
driving = models.BooleanField(default=False) 
license_class = models.IntegerField(blank=True, null=True, choices=LICENSE_CHOICES) 
vehicle = models.CharField(max_length=100, blank=True) 
show = models.ForeignKey(Show, on_delete=models.CASCADE, null=True, blank=True) 
links = ArrayField(models.URLField(max_length=100, blank=True, null=True), blank=True, null=True) 
focus = ArrayField(models.CharField(max_length=50, null=True, choices=FOCUS_CHOICES), blank=True, null=True) 
is_active = models.BooleanField(default=True) 
is_admin = models.BooleanField(default=False) 
call_preference = ArrayField(models.CharField(max_length=90, choices=FOCUS_CHOICES, null=True), blank=True, null=True) 
blocked = models.ManyToManyField('self', related_name='blocked', blank=True) 
qualified_positions = ArrayField(models.CharField(max_length=50, choices=FOCUS_CHOICES, null=True), null=True, blank=True) 
years = models.IntegerField(default=1) 
trade = ArrayField(
    models.CharField(max_length=50, choices=TRADE_CHOICES), 
    null = True, 
    blank = True 
) 

member = models.BooleanField(default=False) 

available = models.BooleanField(default=False) 
available_from = models.DateField(null=True, blank=True) 
available_to = models.DateField(null=True, blank=True) 
range = DateRangeField(null=True, blank=True) 

objects = UserManager() 

过滤器: - 可 - BooleanField,如果可在指定日期的 - 位置 - CharField的选择,可以选择1点 - 贸易 - BooleanField的选择,可以选择多个 - 会员 - 是选定工会的成员

当前有通用的ListView和UserManager()充满最近键入和未经测试的查询,可能需要很多工作。

def base_get(self, start_date, **kwargs): 
    #user = kwargs.pop('user') 
    rightthefucktoday = datetime.date.today() 
    rightthefucktomorrow = datetime.date.today() + datetime.timedelta(days=1) 
    f = [] 
    if start_date and 'end_date' in kwargs:         ## is user.range contains the range of dates 
     diff = kwargs.pop('end_date') - start_date 
     date_range = [] 
     for i in range(diff.days + 1): 
      date_range.append(start_date + datetime.timedelta(days=i)) 
     f = self.filter(range_range=(date_range)).order_by('years', 'member')#.exclude(user=user) 
     return f 
    elif start_date and not 'end_date' in kwargs: 
     ## if end date isn't specified 
     if start_date == rightthefucktomorrow: 
      f = self.filter(available=True).order_by('years', 'member').exclude(available_to=rightthefucktoday) ## if the date specified is tomorrow 
      return f 
     else: 
      f = self.filter(range_contains = start_date).order_by('years', 'member')#.exclude(user=user) # if date specified is not tomorrow 
      return f 
    else: ## no date specified, which is impssible 
     f = self.filter(available=True).order_by('years', 'member')#.exclude(user=user) #return if available 
     return f 


def get_by_position(self, position): 
    u = self.filter(qualified_positions_contains=position) 
    return u 

def get_by_trade(self, *args): 
    shit = [] 
    for i in args: 
     shit.append(i) 
    c = self.filter(trade_contains=shit) 
    return c 

def get_by_union(self, union): ## input must be "IATSE 891", "IATSE 669", or "ACFC 2020" 
    return self.filter(union__union__exact_=union) 


def get_by_member(self): 
    return self.filter(member=True) ##if only members 


def master_query(self, start_date, *args, **kwargs): ## args must be trade details TODO: Test, and build test cases 
    f, u, c, k = [] 
    if 'end_date' in kwargs: f = self.base_get(start_date, kwargs.pop('end_date')) 
    else: f = self.base_get(start_date) 
    it = f 

    if 'position' in kwargs: u = self.get_by_position(kwargs.pop('position')); it = it | u 
    if 'union' in kwargs: c = self.get_by_union(kwargs.pop('union')); it = it | c 
    if args.count() != 0: k = self.get_by_trade(args); it = it | k 
    if 'member' in kwargs: you = self.get_by_member(); it = it | you 

    return it 

如果有人可以轻移我在正确的方向,只要处理模板和观点正确 - 我会永远爱你

谢谢应用滤镜

回答

0

一种方式是通过使用GET参数。 (URL中'?'之后的部分[例如https://search.yahoo.com/search?p=test+search])。因此,在您的模板中创建一个表格method='GET',并通过self.request.GET(我认为您必须为此启用RequestContextProcessor)来处理GET参数。