Form.is_valid() на templateview в случае создания
У меня есть Product
, который выглядит следующим образом:
class Product(models.Model):
data = models.JSONField()
number = models.PositiveIntegerField()
store = models.ForeignKey(Store, on_delete = models.CASCADE)
и я создаю форму динамически, которую я заполняю значениями из базы данных в случае обновления следующим образом:
class ProductUpdateView(TemplateView):
def post(self, request, *args, **kwargs):
obj = Product.objects.get(pk = kwargs["pk"])
form = ProductForm(request.POST or None, request.FILES, product = obj)
if form.is_valid():
for key in form.cleaned_data:
...
пока все хорошо, я могу использовать метод форм clean
таким образом для проверки данных и сохранения обновленных данных.
Но теперь о случае create: сначала я создаю пустую форму (это работает хорошо) и ввожу некоторые данные, затем я публикую их:
class ProductCreateView(TemplateView):
template_name = "store/new_product.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
store = Store.objects.get(user = self.request.user)
tmp_product = Product.objects.filter(store = store).last()
product_data = {"number": tmp_product.number + 1}
for key, value in tmp_product.data.items():
product_data[key] = None
context["form"] = ProductForm(product = tmp_product, initial = product_data)
return context
def post(self, request, *args, **kwargs):
obj = Product.objects.create(number = request.POST["number"], data = {})
form = ProductForm(request.POST, request.FILES, product = obj)
if form.is_valid() ...
В приведенном выше ProductCreateView
метод get_context_data()
работает хорошо. Но в методе post()
результат form.is_valid()
из ProductForm
показывает:
def clean(self):
cleaned_data = super().clean()
print(cleaned_data)
просто: {'number': 17}
для request.POST
, который выглядит как: <QueryDict: {'number': ['17'], 'name': ['testname'], 'price': ['1.99'], ...}>
почему не все из request.POST в cleaned_data
форме, как в случае с обновлением?
Еще одно наблюдение, которое я сделал, пытаясь отладить:
request.POST для случая обновления/создания:
<QueryDict: {'number': ['5'], 'name': ['testfield'], 'price': ['15.24']}> ## update case
<QueryDict: {'number': ['17'], 'name': ['another'], 'price': ['2']}> ## create case
очищенные данные из clean()
:
{'number': 17} ## update case
{'number': 5, 'name': 'testfield', 'price': Decimal('15.24')} ## create case
но self.data
в clean()
методе:
<QueryDict: {'number': ['5'], 'name': ['testfield'], 'price': ['15.24']}> ## update
<QueryDict: {'number': ['17'], 'name': ['another'], 'price': ['15.24']}> ## create