В раскрывающемся поле формы Django отображаются данные, принадлежащие другим пользователям

#python #django #django-models #django-views #django-forms

#python #django #django-модели #django-представления #django-forms

Вопрос:

У меня возникли проблемы с запросом только пользовательских элементов из CreateView и Form:

 # views.py
class ExpenseCreateView(LoginRequiredMixin, CreateView):
    model = Expense
    form_class = ExpenseCreateForm
    template_name = "expenses/expense_form.html"
    success_url = reverse_lazy("expense-list")

    def form_valid(self, form):
        form.instance.owner = self.request.user
        return super(ExpenseCreateView, self).form_valid(form)
 
 # forms.py
class ExpenseCreateForm(forms.ModelForm):
    class Meta:
        model = Expense
        exclude = ("owner", )
        widgets = {"date": DateInput(), "time": TimeInput()}
 
 # models.py
class Expense(models.Model):
    date = models.DateField(db_index=True)
    time = models.TimeField(null=True, blank=True)
    amount = models.DecimalField(max_digits=10, decimal_places=2, help_text="Amount of € spent.")
    location = models.ForeignKey("Location", on_delete=models.SET_NULL, null=True)
    document = models.FileField(
        upload_to=UploadToPathAndRename("documents/"), blank=True, null=True
    )
    image = models.ImageField(
        upload_to=UploadToPathAndRename("images/"), blank=True, null=True
    )
    payment = models.ForeignKey("Payment", on_delete=models.SET_NULL, db_index=True, null=True)
    comment = models.TextField(null=True, blank=True, help_text="Additional notes...")
    owner = models.ForeignKey(User, on_delete=models.CASCADE)

class Payment(models.Model):
    title = models.CharField(max_length=100)
    comment = models.TextField(blank=True, null=True)
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
 

Форма работает, но каждый пользователь может видеть местоположение и оплату других пользователей. Какое правильное место и способ добавить проверку / проверку только для возврата местоположения, принадлежащего пользователю, отправляющему запрос?

Ответ №1:

Обычно я передаю пользователя в качестве аргумента форме, чтобы задать набор запросов для ограничения выбора.

 class ExpenseCreateView(LoginRequiredMixin, CreateView):
    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs["user"] = self.request.user
        return kwargs

class ExpenseCreateForm(forms.ModelForm):
    def __init__(self, *args, user, **kwargs):
        super().__init__(self, *args, **kwargs)
        self.fields['location'].queryset = user.location_set.all()
        self.fields['payment'].queryset = user.payment_set.all()
 

Комментарии:

1. Спасибо, кажется, это работает. Хотя вам нужно удалить self in super().__init__(self, *args, **kwargs) , иначе будет AttributeError: 'ExpenseCreateForm' object has no attribute 'get' исключение.

2. По моему опыту, то, что у меня есть, должно быть в порядке, если вы не делаете что-то странное. Возможно, у вас что-то настроено неправильно.