def __init__(self, request=None, instance=None): field = instance # alias post = None if not request else request.POST self.form = FieldForm(post, instance=field) self.optionsFormset = None # Создание формсета, если необходимо if not field or (field and field.fieldType == 'list'): # Используем form=<наш базовый класс формы>! OptionsFormset = inlineformset_factory(Field, FieldOption, form=ModelForm) # # Передаём instance=form.instance, а не field. В качестве field мог # быть передан None; в этом случае пустой instance создаётся внутри # конструктора формы. # # При выполнении сохранения формсет пунктов списка будет обращаться к # заданному instance за идентификатором динамического поля. В случае, # когда на странице добавляется новое динамическое поле (а не редактируется # существующее), особо важно, чтобы instance, на который ссылаются форма # и формсет, был одним объектом, чтобы формсет узнал идентификатор # вновь добавленной записи. # self.optionsFormset = OptionsFormset(post, instance=self.form.instance)
def post(self, request): user = request.user form = FieldForm(request.POST) if form.is_valid(): cd = form.cleaned_data field = form.save(commit=False) field.user = user field.save() return redirect('/fields/') messages.add_message(request, messages.INFO, 'Поле с таким именем уже существует!') return render(request, 'fields/field_add.html', {'form': FieldForm()})
class FieldFormAndFormset(object): def __init__(self, request=None, instance=None): field = instance # alias post = None if not request else request.POST self.form = FieldForm(post, instance=field) self.optionsFormset = None # Создание формсета, если необходимо if not field or (field and field.fieldType == 'list'): # Используем form=<наш базовый класс формы>! OptionsFormset = inlineformset_factory(Field, FieldOption, form=ModelForm) # # Передаём instance=form.instance, а не field. В качестве field мог # быть передан None; в этом случае пустой instance создаётся внутри # конструктора формы. # # При выполнении сохранения формсет пунктов списка будет обращаться к # заданному instance за идентификатором динамического поля. В случае, # когда на странице добавляется новое динамическое поле (а не редактируется # существующее), особо важно, чтобы instance, на который ссылаются форма # и формсет, был одним объектом, чтобы формсет узнал идентификатор # вновь добавленной записи. # self.optionsFormset = OptionsFormset(post, instance=self.form.instance) def is_valid(self): return self.form.is_valid() and (not self.optionsFormset or self.optionsFormset.is_valid()) def save(self): self.form.save() if self.form.instance.fieldType == 'list': # # Здесь проверка не на существование self.optionsFormset, потому что при # заведении нового динамического поля формсет показывается, но должен быть # сохранён, только если созданное динамическое поле имеет тип «выбор из списка» # # Дополнительно существование optionsFormset проверять не надо. Для # существующего динамического поля формсет создаётся тогда и только тогда, когда # это динамическое поле имеет тип «выбор из файла», а тип динамического поля # нельзя поменять после создания. # self.optionsFormset.save()
def post(self, request, slug): instance = get_object_or_404(Field, slug=slug) form = FieldForm(request.POST, instance=instance) if form.is_valid(): form.save() return redirect('/fields/{}/'.format(slug)) messages.add_message(request, messages.INFO, 'Данные неккоректны') return render(request, 'fields/field_add.html', {'form': FieldForm()}) # class CropView(View): # def get(self, request): # crops = Field.objects.prefetch_related().all() # # for crop in crops: # print('{}'.format(crop.name, crop.season)) # # return render(request, 'fields/field_add.html', {'form': FieldForm()})
def get(self, request, slug): instance = get_object_or_404(Field, slug=slug) return render(request, 'fields/field_add.html', {'form': FieldForm(instance=instance)})
def get(self, request): return render(request, 'fields/field_add.html', {'form': FieldForm()})