限制下拉列表导致通用UpdateView

时间:2019-03-07 23:51:22

标签: django

致力于我的第一个Django项目!我有一个UpdateView,我想限制program_code的下拉结果,因此它仅显示用户拥有的项目。我认为我必须将kwargs传递给视图以限制queryset,但不确定从何处开始或如何进行。任何建议将不胜感激。

查看:

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 :(得分:0)

您可以尝试这样:

# 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__方法以捕获从View发送的user数据,并使用它覆盖字段queryset的默认program_code值。 / p>