Фильтрация данных на основе внешнего ключа - Django - PullRequest
0 голосов
/ 21 мая 2019

У меня проблема с динамическим заполнением данных формы на основе предыдущего выбранного поля. В моем случае у меня есть две модели, одна из которых содержит разные типы членства в разных клубах. Затем у меня есть другая модель, которая обрабатывает регистрации для отдельных клубов.

Моя проблема - когда конечный пользователь готов подписать форму рендеринга (я уже отфильтрую участников по клубу, который они первоначально выбрали), но мне нужно отфильтровать цену по выбранному членству (внешний ключ) Модель игрока.

Ниже моя модель для типов членства:

Модель для хранения доступных клубов членства, чтобы участники могли выбирать и платить на странице регистрации

class ClubMemberships(models.Model):

club_id = models.ForeignKey(ClubInfo, on_delete=models.CASCADE)
title = models.CharField(max_length=30, default='')
price = models.DecimalField(default=0.00, max_digits=6, decimal_places=2)
description = models.TextField()

def __str__(self):
    return self.title

Вот модель для регистрации:

Модель для хранения информации об игроке, которая будет использоваться для регистрации членства

class Player(models.Model):

club_id = models.ForeignKey(ClubInfo, on_delete=models.CASCADE)
membership_title = models.ForeignKey(ClubMemberships, on_delete=models.CASCADE)
price = models.DecimalField(max_digits=10, decimal_places=2)
first_name = models.CharField(max_length=20)
last_name = models.CharField(max_length=20)
dob = models.DateField(max_length=8)
email = models.EmailField(max_length=50)
phone = models.CharField(max_length=12)
mobile = models.CharField(max_length=15)
emergency_contact_name = models.CharField(max_length=40)
emergency_contact_mobile = models.CharField(max_length=15)
address1 = models.CharField(max_length=30)
address2 = models.CharField(max_length=30, default='')
address3 = models.CharField(max_length=30, default='')
town = models.CharField(max_length=30)
county = models.CharField(max_length=30)
country = models.CharField(max_length=30)

def __str__(self):
    return "%s %s" % (self.first_name, self.last_name)

Форма для регистрации игрока:

Форма для принятия реквизитов для регистрации

class PlayerRegistrationForm(forms.ModelForm):

class Meta:
    model = Player
    fields = '__all__'
    labels = {
        'dob': 'Date of Birth'
    }
    widgets = {
        'dob': forms.DateInput(attrs={'id': 'datepicker'})
    }

def __init__(self, *args, **kwargs):
    super(PlayerRegistrationForm, self).__init__(*args, **kwargs)
    self.fields['club_id'].widget = forms.HiddenInput()

def load_price(self, request):
    membership = request.GET.get('membership_title')
    title = ClubMemberships.objects.filter(title=membership)
    self.fields['price'].queryset = ClubMemberships.objects.filter(price=title.price)

load_price - пример того, что я пытаюсь выполнить, но не могу заставить его работать. Я хочу, чтобы форма проверяла членство, выбранное в форме, затем отфильтровывала цену этого членства и отображала ее в форме.

Вот моя форма в браузере:

форма

Буду очень признателен за любую помощь, поскольку я не могу включить PayPal, пока не смогу правильно отобразить цену.

Спасибо

1 Ответ

0 голосов
/ 21 мая 2019

Это пример, основанный на производителе автомобилей и моделях.

Этот javascript ищет, когда производитель изменяется в выпадающем списке

$("#id_car_make").change(function () {
    var url = $("#searchForm").attr("data-models-url");  // get the url of the `load_cities` view
    var carMakeId = $(this).val();  // get the selected country ID from the HTML input

    $.ajax({                       // initialize an AJAX request
        url: url,                    // set the url of the request (= localhost:8000/hr/ajax/load-cities/)
        data: {
            'car_make': carMakeId       // add the country id to the GET parameters
        },
        success: function (data) {   // `data` is the return of the `load_cities` view function
            $("#id_car_model").html(data);  // replace the contents of the city input with the data that came from the server
        }
    });

});

он называет этот URL

    path('ajax/load-models/', views.load_models, name="ajax_load_models"),

, который вызывает это представление

def load_models(request):
    car_make_id = request.GET.get('car_make')
    car_models = CarModel.objects.filter(car_make_id=car_make_id).order_by('name')
    return render(request, 'leases/partials/car_model_dropdown_list_options.html', {'car_models': car_models})

, который использует этот шаблон для передачи выпадающего списка моделей в javascript

    <option value="">Model</option>
    {% for car_model in car_models %}
    <option value="{{ car_model.pk }}">{{ car_model.name }}</option>
    {% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...