Django: передача атрибутов min и max в средство выбора даты в представлении ClassBased - PullRequest
0 голосов
/ 11 сентября 2018

Я создаю систему представления расходов, которая является многопользовательской.Для целей этого вопроса есть две модели: Claim и Journey.Пользователь создает заявку, и каждая заявка может иметь несколько поездок.

В журнале CreateView следующий код:

  • Автозаполняет раскрывающуюся форму заявки, для которой регистрируется поездка.на основе заявления pk, переданного в URL.
  • На основе зарегистрированного пользователя отображаются только заявки для этого пользователя (в раскрывающемся списке)
  • Устанавливает атрибут HTML для <input>;type=date отображает селектор даты, а min='2018-09-10' указывает запрещенный диапазон дат:

date with allowable range

В следующем представлении я вычисляюминимальная и максимальная даты, которые правильно выводятся при проверке работоспособности:

class JourneyCreateView(CreateView):
    model = Journey
    form_class = JourneyForm

    def get_initial(self):
        try:
            # Calculate date limit for the date picker
            min = Claim.objects.get(id=self.kwargs['claim']).week_commencing
            max = min + timedelta(days=7)

            # Obtain the claim ID from the URL
            claim = self.kwargs['claim']

            # Sanity check
            print (claim, min, max)

            return {'claim': claim, 'min':min, 'max':max}

        except Exception as ex:
            print (ex)
            return {}

    def get_form_kwargs(self, *args, **kwargs):
        # Only show claims owned by the logged in user in the claim dropdown
        kwargs = super().get_form_kwargs(*args, **kwargs)
        kwargs['alloweduser'] = self.request.user.id
        return kwargs

и форма:

class JourneyForm(forms.ModelForm):
    # set html attribs which will apply to the form.
    date = forms.CharField(widget=forms.TextInput(attrs={'type':'date',
                                                        'min':'2018-09-10'
                                                        }))
    class Meta:
        model = Journey
        fields = ['date', 'distance','claim']

    def __init__(self,alloweduser,*args,**kwargs):
        # Make sure only to display the user's own claims.
        super (JourneyForm,self ).__init__(*args,**kwargs) 
        self.fields['claim'].queryset = Claim.objects.filter(tech_id=alloweduser)

В этом коде claim также возвращается get_initial() иправильно предварительно заполняет раскрывающийся список претензий текущей претензией:

return {'claim': claim, 'min':min, 'max':max}

Однако меня смущает то, как я обращаюсь к переменным min и max, возвращаемым get_initial() в третья строка формы, чтобы заменить строку ручного теста.

1 Ответ

0 голосов
/ 12 сентября 2018

Я решил это сам.Мое решение:

В CreateView вместо логики get_initial вместо логики *1005* поместите логику:

d = Claim.objects.get(id=self.kwargs['claim']).week_commencing
kwargs['min'], kwargs['max'] = d, d+timedelta(days=7)

min и max затем станутаргументы при перебросе __init__ в ModelForm:

def __init__(self,alloweduser,min,max,*args,**kwargs):
    # Make sure only to display the user's own claims.
    super (JourneyForm,self ).__init__(*args,**kwargs) 
    self.fields['claim'].queryset = Claim.objects.filter(tech_id=alloweduser)
    self.fields['date'] = forms.CharField(widget=forms.TextInput(attrs={'type':'date',
                                                    'min':min, 'max':max
                                                    }))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...