У меня проблемы с запросом только элементов, принадлежащих пользователю, из 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)
Форма работает, но каждый пользователь может видеть Местоположение и Платежи других пользователей. Какое правильное место и способ добавить проверку/проверку, чтобы возвращать только местоположение, которое принадлежит пользователю, отправляющему запрос?
Обычно я передаю пользователя в качестве аргумента в форму, чтобы установить набор запросов для ограничения выбора.
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()
То, что у меня есть, по моему опыту должно быть в порядке, если только вы не делаете что-то странное. Возможно у вас что-то не так настроено.
Спасибо, вроде работает. Хотя вам нужно удалить себя в
super().__init__(self, *args, **kwargs)
, иначе будетAttributeError: 'ExpenseCreateForm' object has no attribute 'get'
исключение.