Ограничить выпадающие результаты в общем UpdateView - PullRequest
0 голосов
/ 08 марта 2019

Работаю над моим первым проектом Django! У меня есть UpdateView, и я хочу ограничить результаты выпадающего кода program_code, чтобы он отображал только те элементы, которые принадлежат пользователю. Я думаю, что должен передать kwargs в представление, чтобы ограничить набор запросов, но не уверен, с чего начать и как это сделать. Любой совет будет принята с благодарностью.

Вид:

class ContactsUpdateView(LoginRequiredMixin, UserPassesTestMixin, SuccessMessageMixin, UpdateView):
    model = Contact
    fields = ['first_name1', 'last_name1','address1','address2','city','province','postal_code','country','active_status','program_code']
    template_name = 'contacts/contacts_form.html'
    success_message = "Contact was updated successfully"

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

    def test_func(self):
        contact = self.get_object()
        if self.request.user == contact.author:
            return True
        return False

Модель:

class Contact(models.Model):
    first_name1 = models.CharField(max_length=100, verbose_name='First Name', null=True)
    last_name1 = models.CharField(max_length=100, verbose_name='Last Name', null=True)
    address1 = models.CharField(max_length=100, verbose_name='Address 1', null=True)
    address2 = models.CharField(max_length=100, verbose_name='Address 2', null=True, blank=True)
    city = models.CharField(max_length=100, verbose_name='City', null=True)
    province = models.CharField(max_length=2, choices=PROVINCE_CHOICES, default='Ontario', verbose_name='Province')
    postal_code = models.CharField(max_length=7, verbose_name='Postal Code', null=True)
    country = models.CharField(max_length=100, verbose_name='Country', null=True, default='Canada')
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    active_status = models.BooleanField(default=True)
    program_code = models.ForeignKey(Program, on_delete=models.CASCADE)

    def __str__(self):

        return self.first_name1 + ' ' + self.last_name1

    def get_absolute_url(self):

        return reverse('contacts-home')

шаблон формы:

<form method="POST">
        {% csrf_token %}
        <fieldset class="form-group">
            <legend class="border-bottom mb-2 mt-2">Update Contact</legend>
            <p>Created by: {{ object.author }},  Last Updated: {{ object.date_posted }}</p>
            {{ form|crispy }}
        </fieldset>
        <div class="form-group">
            <button class="btn btn-info" type="submit">Update</button>

            <div class="mt-4"><a class="btn btn-outline-danger btn-sm" href="{% url 'contacts-delete' object.id %}" role="button">Delete Contact</a></div>

        </div>
    </form>

1 Ответ

0 голосов
/ 08 марта 2019

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

# form
class ContactForm(forms.ModelForm):
   def __init__(self, *args, **kwargs):
       user = kwargs.pop('user', None)  # This will be sent from View
       super(ContactForm, self).__init__(*args, **kwargs)
       self.fields['program_code'].queryset = Program.objects.filter(owner=user)

   class Meta:
        model = Contact
        fields = ['first_name1', 'last_name1','address1','address2','city','province','postal_code','country','active_status','program_code']

#view

class ContactsUpdateView(LoginRequiredMixin, UserPassesTestMixin, SuccessMessageMixin, UpdateView):

    model = Contact
    from_class = ContactForm
    template_name = 'contacts/contacts_form.html'
    success_message = "Contact was updated successfully"

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

    def get_form_kwargs(self):  
        # Sending user information to Form
        kwargs = super(ContactsUpdateView, self).get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

Здесь, в представлении, мы переопределяем метод get_form_kwargs для передачи текущей user информации в форму. А внутри формы мы переопределяем метод __init__, чтобы перехватить данные user, отправленные из View, и используем его для переопределения значения по умолчанию queryset поля program_code.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...