Создание поля динамического выбора

Резюме this Javascript:

  • Значение this определяется тем, как функция вызывается не, где она была создана!
  • Обычно значение из this определяется Объектом, который остается от точки. (window в глобальном пространстве)
  • В случае прослушивателей значение this относится к элементу DOM, на котором было вызвано событие.
  • Когда функция вызывается с помощью new ключевое слово значение this относится к вновь созданному объекту
  • Вы можете управлять значением this с помощью функций: call, apply, bind

Пример:

let object = {
  prop1: function () {console.log(this);}
}

object.prop1();   // object is left of the dot, thus this is object

const myFunction = object.prop1 // We store the function in the variable myFunction

myFunction(); // Here we are in the global space
              // myFunction is a property on the global object
              // Therefore it logs the window object
              
             

Пример прослушивателей событий:

document.querySelector('.foo').addEventListener('click', function () {
  console.log(this);   // This refers to the DOM element the eventListener was invoked from
})


document.querySelector('.foo').addEventListener('click', () => {
  console.log(this);  // Tip, es6 arrow function don't have their own binding to the this v
})                    // Therefore this will log the global object
.foo:hover {
  color: red;
  cursor: pointer;
}
<div class="foo">click me</div>

Пример конструктора:

function Person (name) {
  this.name = name;
}

const me = new Person('Willem');
// When using the new keyword the this in the constructor function will refer to the newly created object

console.log(me.name); 
// Therefore, the name property was placed on the object created with new keyword.

127
задан Serjik 19 December 2015 в 08:15
поделиться

3 ответа

вы можете фильтровать путевые точки, передавая пользователя в форму init

class waypointForm(forms.Form):
    def __init__(self, user, *args, **kwargs):
        super(waypointForm, self).__init__(*args, **kwargs)
        self.fields['waypoints'] = forms.ChoiceField(
            choices=[(o.id, str(o)) for o in Waypoint.objects.filter(user=user)]
        )

из вашего представления, при инициации формы передайте пользователю

form = waypointForm(user)

в случае модельной формы

class waypointForm(forms.ModelForm):
    def __init__(self, user, *args, **kwargs):
        super(waypointForm, self).__init__(*args, **kwargs)
        self.fields['waypoints'] = forms.ModelChoiceField(
            queryset=Waypoint.objects.filter(user=user)
        )

    class Meta:
        model = Waypoint
180
ответ дан 24 November 2019 в 00:47
поделиться

Для вашей проблемы есть встроенное решение: ModelChoiceField .

Как правило, всегда стоит попробовать использовать ModelForm , когда вам нужно создать / изменить объекты базы данных. Работает в 95% случаев, и это намного чище, чем создание собственной реализации.

10
ответ дан 24 November 2019 в 00:47
поделиться

Как насчет передачи экземпляра райдера в форму при ее инициализации?

class WaypointForm(forms.Form):
    def __init__(self, rider, *args, **kwargs):
      super(joinTripForm, self).__init__(*args, **kwargs)
      qs = rider.Waypoint_set.all()
      self.fields['waypoints'] = forms.ChoiceField(choices=[(o.id, str(o)) for o in qs])

# In view:
rider = request.user
form = WaypointForm(rider) 
4
ответ дан 24 November 2019 в 00:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: