2016-06-07 3 views
0

나는 쿼리 필터 메뉴와 비슷하지만 훨씬 간단한 사용자 목록 페이지를 구축하고자합니다. 나는 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을 통해 GET 매개 변수를 처리하십시오 (이 경우 RequestContextProcessor를 활성화해야한다고 생각합니다).