#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. По моему опыту, то, что у меня есть, должно быть в порядке, если вы не делаете что-то странное. Возможно, у вас что-то настроено неправильно.