Django: ограничение выбора в моделях. Charfield от PrimaryKey - PullRequest
0 голосов
/ 16 апреля 2020

Еще один вопрос от меня сегодня вечером, и я надеюсь, что смогу объяснить его адекватно:

Я получил три класса в моем "models.py":

class Customer(models.Model):
    full_name = models.CharField(max_length=100, null=True, unique=True)
    short_name = models.CharField(max_length=8, null=True, unique=True)

class Project(models.Model):
    customer = models.ForeignKey(Customer, null=False, on_delete=models.CASCADE)
    name = models.CharField(max_length=255, null=True, unique=True)
    ...

class Entry(models.Model):
    user = models.ForeignKey(User, null=True, blank=False, on_delete=models.CASCADE)
    customer = models.ForeignKey(Customer, null=True, blank=False, on_delete=models.CASCADE)
    project = models.ForeignKey(Project, null=True, blank=False, on_delete=models.CASCADE)
    date = models.DateField()
    shortText = models.CharField(max_length=100, null=False, blank=False)
    ...

Примечание: один клиент может иметь несколько проектов.

На одном из моих сайтов есть таблица с кнопками рядом с каждым "Клиентом". План состоит в том, что это должно привести меня к другой странице, где пользователь может написать и сохранить свою «запись». Прямо сейчас PrimaryKey внутри Button / Link содержит идентификатор «Клиента».

Мой вопрос: возможно ли ограничить выбор «Проекта» (внутри выпадающего меню) на "Клиента", на который нажали? И правильно ли создавать ModelForm?

Спасибо всем вам и спокойной ночи!

1 Ответ

0 голосов
/ 16 апреля 2020

Ну, не знаю, если это правильный путь, но я нашел решение для моей проблемы:

  1. Написал "forms.ModelForm" для моей функции просмотра. ..

    class EntryForm(ModelForm):
        class Meta:
            model = Entry
            fields = '__all__'
    
        def __init__(self, *args, pk, **kwargs):
            super().__init__(*args, **kwargs)
            self.fields['project'].queryset = Project.objects.filter(customer_id=pk)
    
  2. Вставьте мою ModelForm в функцию просмотра ...

    def WriteEntry(request, pk):
        form = EntryForm(pk=pk)
        if request.method =='POST':
            form = EntryForm(request.POST, pk)
            if form.is_valid():
                form.save()
                ...
    
        context = {'form': form}
        return render(request, '...html', context)
    
...