Невозможно ограничить выбор поля формы конкретным пользователем - PullRequest
1 голос
/ 23 сентября 2019

Как гласит заголовок, я не могу ограничить выбор поля формы в зависимости от конкретного пользователя.Например, при выборе для зарегистрированного поля формы все «гонщики» выбираются всеми «пользователями», а не только «гонщиками», которые «принадлежат» пользователю.

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

Любой совет будетс благодарностью.

models.py

class Event(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=200, null=True)
    description = models.TextField(max_length=255, null=True, blank=True)
    start = models.DateTimeField(null=True, blank=True)
    end = models.DateTimeField(null=True, blank=True)
    enrolled = models.ManyToManyField('riders.Rider', 
               related_name='events', blank=True)

    def __str__(self):
        return self.title

model.py (другое приложение)

class Rider(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    birthdate = models.DateField(verbose_name=None, auto_now=False)
    owner = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.last_name + ', ' +self.first_name

views.py

@login_required
def enroll(request, event_id):
    event = Event.objects.get(id=event_id)

    if request.method != 'POST':
        form = EventForm(instance=event)
    else:
        form = EventForm(instance=event, data=request.POST)
        if form.is_valid():
            enroll = form.save(commit=False)
            enroll.save()
            form.save_m2m()

        return HttpResponseRedirect(reverse('riding_schedule:view_events'))

форм.py

class EventForm(forms.ModelForm):
    class Meta:
        model = Event
        fields = ['title', 'start', 'end', 'enrolled']
        labels = {'text':''}
        widgets = {

            'enrolled': forms.CheckboxSelectMultiple()
        }

1 Ответ

1 голос
/ 23 сентября 2019

Вы можете попробовать вот так:

Сначала отправьте информацию о текущем пользователе в форму при запуске формы:

@login_required
def enroll(request, event_id):
    event = Event.objects.get(id=event_id)
    if request.method != 'POST':
        form = EventForm(instance=event, user=request.user)  # <-- Here
    else:
        form = EventForm(instance=event, data=request.POST)
    # ....

Затем используйте эту информацию в форме следующим образом:

class EventForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user', None)
        super(EventForm, self).__init__(*args, **kwargs)
        if user:
           self.fields['enrolled'].queryset = Rider.objects.filter(owner=user)  # overriding the queryset for enrolled here

    class Meta:
        model = Event
        fields = ['title', 'start', 'end', 'enrolled']
        labels = {'text':''}
        widgets = {

            'enrolled': forms.CheckboxSelectMultiple()
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...