当我有一个有效的Django表单时,我可以使用form.cleaned_data访问数据.但是,当表单无效时,如何获取用户输入的数据,即form.is_valid为false.
我正在尝试访问表单集中的表单,因此form.data似乎只是给我一个烂摊子.
鉴于以下型号:
class Graph(models.Model):
owner = models.ForeignKey(User)
def __unicode__(self):
return u'%d' % self.id
class Point(models.Model):
graph = models.ForeignKey(Graph)
date = models.DateField(primary_key = True)
abs = models.FloatField(null = True)
avg = models.FloatField(null = True)
def __unicode__(self):
return u'%s' % self.date
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建一个用于编辑Points列表的表单.HTML输入标记需要设置其他属性,因此我使用以下自定义表单:
class PointForm(forms.ModelForm):
graph = forms.ModelChoiceField(queryset = Graph.objects.all(),
widget = forms.HiddenInput())
date = forms.DateField(widget = forms.HiddenInput(), label = 'date')
abs = forms.FloatField(widget = forms.TextInput(
attrs = {'class': 'abs-field'}),
required = False)
class Meta:
model = Point
fields = ('graph', 'date', 'abs') # …Run Code Online (Sandbox Code Playgroud) 我无法使用formset运行Unit Test.
我尝试做一个测试:
class NewClientTestCase(TestCase):
def setUp(self):
self.c = Client()
def test_0_create_individual_with_same_adress(self):
post_data = {
'ctype': User.CONTACT_INDIVIDUAL,
'username': 'dupond.f',
'email': 'new@gmail.com',
'password': 'pwd',
'password2': 'pwd',
'civility': User.CIVILITY_MISTER,
'first_name': 'François',
'last_name': 'DUPOND',
'phone': '+33 1 34 12 52 30',
'gsm': '+33 6 34 12 52 30',
'fax': '+33 1 34 12 52 30',
'form-0-address1': '33 avenue Gambetta',
'form-0-address2': 'apt 50',
'form-0-zip_code': '75020',
'form-0-city': 'Paris',
'form-0-country': 'FRA',
'same_for_billing': True,
}
response = self.c.post(reverse('client:full_account'), post_data, follow=True)
self.assertRedirects(response, '%s?created=1' % reverse('client:dashboard'))
Run Code Online (Sandbox Code Playgroud)
我有这个错误:
ValidationError:[u'ManagementForm数据丢失或被篡改']
我的看法 …
我已经构建了这个包含通用外键的模型:
class MyModel(models.Model):
content_type = models.ForeignKey(ContentType, verbose_name=_('content type'))
object_id = models.PositiveIntegerField(_('object id'))
content_object = generic.GenericForeignKey('content_type', 'object_id')
Run Code Online (Sandbox Code Playgroud)
接下来我制作了一个通用的堆叠内联,将它放在任何ModelAmin类中:
class MyModelStackedInline(generic.GenericStackedInline):
model = MyModel
formset = generic.generic_inlineformset_factory(MyModel, can_delete=False)
extra = 0
class SomeOhterModelAdmin(admin.ModelAdmin):
inlines = [MyModelStackedInline]
Run Code Online (Sandbox Code Playgroud)
但是,尽管delete=False在generic_inlineformset_factory中传递了can_ arg ,但我总是Delete在管理员change_form中看到一个复选框.
这是一个例子:http://img8.imageshack.us/img8/3323/screenshotbe.png
你知道如何删除这个复选框?
谢谢 :)
在我的Django应用程序应用程序中,我有一个从简单(非模型)形式创建的formset,其中extra = 1(以允许javasript稍后添加更多表单).
class SomeForm(forms.Form):
#some fields with required=False
length = forms.IntegerField(required=False)
# An example of one of the fields with choices i have
A = 0
B = 1
C = 2
D = 3
choices = ((A, 'Aah'), (B, 'Baa'), (C, 'Caa'), (D, 'Daa'))
# This is a required choice field
pickme = forms.ChoiceField(choices=choices)
SomeFormset = formset_factory(SomeForm, can_delete=True, extra=1)
Run Code Online (Sandbox Code Playgroud)
现在,当我创建并尝试在我的POST请求视图中验证它时:
my_formset = SomeFormset(request.POST, request.FILES)
if(my_formset.is_valid()):
# FAIL
Run Code Online (Sandbox Code Playgroud)
如果额外呈现的表单被提交为空,则它始终未通过上述检查.
如果我检查form.changed_data最后一个空的额外表格,我会得到有选择的字段(如上面的pickme).换句话说,当需要某些选项字段时,formset不够聪明,无法确定应忽略空提交的表单.
我对formset有点问题.
我必须在页面中显示多个formset,每个formset都有几种形式.所以我做了类似的事情:
#GET
for prod in products:
ProductFormSet = modelformset_factory(Product,exclude=('date',),extra=prod.amount)
formsset.append(ProductFormSet(prefix="prod_%d"%prod.pk))
#POST
for prod in products:
ProductFormSet = modelformset_factory(Product,exclude=('date',),extra=prod.amount)
formsset.append(ProductFormSet(request.POST,prefix="prod_%d"%prod.pk))
Run Code Online (Sandbox Code Playgroud)
问题是,当我提交页面时,空帐表单"自动"有效(没有检查),但是如果我在一个表单中填写一个字段,则检查对其起作用.
我不知道为什么,所以如果有人有想法,
谢谢.
在Django中,表单可能很复杂。表单集可以使您想退出Django。我在那个时候。
有哪些不同的用例,以及要使用哪些用例的注意事项?
我正在寻找有关何时使用每个工厂的更好的指导,因为它们似乎取决于您何时知道什么类型的表单,字段以及是否要创建,编辑或删除(单个表单完全或单独)。父模型)。我已经阅读了许多演练,但是正在努力查看大图,尤其是当我尝试从基于函数的视图转换为基于类的视图时。
以下是一些带有假设/限制的伪代码,可帮助您帮助我理解不同之处。提供伪代码可能会有所帮助,例如哪种类型的表单(ModelForm或常规)与Formset一起使用,或者应该pop从表单中获取什么,因为这似乎是创建具有关系的表单的趋势。
假设您有一些模型:
class Dish(models.Model):
name = models.CharField(max_length=50)
class Meal(models.Model):
name = models.CharField(max_length=50)
dishes = models.ManyToManyField(Dish,
# through='OPTIIONALMealDishIntermediaryClassTable',
related_name="meal")
class Reservation(models.Model):
date = models.DateTimeField()
greeting = models.CharField(max_length=255)
meal = models.OneToOneField(Meal, on_delete=models.CASCADE)
class MealPhotos(models.Model):
photo = models.OneToOneField(Photo, on_delete=models.CASCADE, related_name='mealPhoto')
meal = models.ForeignKey(Meal, on_delete=models.CASCADE)
# optional, so a photo can be attached to a dish if the picture is just of the dish
dish = models.ForeignKey(Dish, blank=True, null=True, on_delete=models.CASCADE)
Run Code Online (Sandbox Code Playgroud)
您想创建一个new Meal,同时要发送一个Reservation:
ModelForms?(这意味着你将如何手柄assignming了 …我正试图弄清楚如何使用Django REST框架保存相关模型.在我的应用程序中,我有一个模型Recipe与2相关模型:RecipeIngredient和RecipeStep.一个Recipe对象必须至少有3个相关的RecipeIngredient和3个RecipeStep.在引入REST框架之前,我使用了一个CreateView带有两个formset 的Django ,并且保存过程如下(遵循代码form_valid()):
def save_formsets(self, recipe):
for f in self.get_formsets():
f.instance = recipe
f.save()
def save(self, form):
with transaction.atomic():
recipe = form.save()
self.save_formsets(recipe)
return recipe
def formsets_are_valid(self):
return all(f.is_valid() for f in self.get_formsets())
def form_valid(self, form):
try:
if self.formsets_are_valid():
try:
return self.create_ajax_success_response(form)
except IntegrityError as ie:
return self.create_ajax_error_response(form, {'IntegrityError': ie.message})
except ValidationError as ve:
return self.create_ajax_error_response(form, {'ValidationError': ve.message})
return self.create_ajax_error_response(form)
Run Code Online (Sandbox Code Playgroud)
现在我有了RecipeViewSet: …
我在表单中有一个表格,由formset生成.
在这种情况下,我的问题是在修改其中一个项目之后保存所有项目,添加一个新的"虚拟"列作为其他两个的总和(仅在显示表时生成,未保存).我尝试了不同的方法,但没有人工作.
问题:
save根本不起作用.当它只是一种形式时它起作用,但不适用于形式amount作为Sum的box_one并box_two没有成功.我也试过这种方式生成表单,但这不起作用:Run Code Online (Sandbox Code Playgroud)formset = modelformset_factory( Item, form=ItemForm)(queryset=Item.objects.order_by( 'code__name').annotate(amount=Sum('box_one') + Sum('box_two')))
此问题与前一个问题有关,但这个新问题更简单: 使用Django从数据库预填充HTML表单表
StackOverflow以前的相关问题很老,对我不起作用.
我正在使用Django 2.0.2
任何帮助,将不胜感激.提前致谢.
当前代码:
models.py
class Code(models.Model):
name = models.CharField(max_length=6)
description = models.CharField(max_length=100)
def __str__(self):
return self.name
class Item(models.Model):
code = models.ForeignKey(Code, on_delete=models.DO_NOTHING)
box_one = models.IntegerField(default=0)
box_two = models.IntegerField(default=0)
class Meta:
ordering = ["code"]
Run Code Online (Sandbox Code Playgroud)
views.py
class ItemForm(ModelForm):
description = CharField()
class Meta:
model = Item
fields = ['code', 'box_one', 'box_two']
def save(self, commit=True): …Run Code Online (Sandbox Code Playgroud) 我决定将我的管理网站的一些功能移到前端.功能包括使用一些外键内联管理一个模型.
为此,我已经安装了django-dynamic-formset JQuery插件(链接git)并且已经挣扎了几天.这是其中一个问题.
Django管理员已经实现了相同的功能.我可以根据需要添加,修改,删除内联和修改模型实例.我想知道为什么我应该使用这个JQuery插件,为什么在互联网上没有这么多关于这个主题的好教程?
我需要一个很好的最近的例子,说明如何在没有第三方JS文件的情况下在前端使用django formsets或inline formsets.如果它有链接(不是复选框)来删除内联项并添加将正确添加新内联的按钮,我会很高兴.
更具体一点,因为这个问题被认为过于宽泛:
我有两个模型School和SchoolPlace:
class School(models.Model):
name = models.CharField(_('School name'), max_length=100)
class SchoolPlace(models.Model):
school = models.ForeignKey(School, verbose_name=_('school place'), related_name='school_places', blank=True, null=True)
name = models.CharField(_('School place name'), max_length=200)
city = models.ForeignKey(City, blank=True, null=True, verbose_name=_('city'),
help_text='city')
Run Code Online (Sandbox Code Playgroud)
还有相应的形式:
class SchoolForm(forms.ModelForm):
name = forms.CharField(
label=_('Name'),
widget=forms.TextInput(attrs={
'placeholder': _('school name')}),
max_length=100, required=True)
class SchoolPlaceForm(forms.ModelForm):
name = forms.CharField(label=_('Name'),
widget=forms.TextInput(
attrs={'placeholder': _('school place name')}),
max_length=200,
required=False)
city = forms.ModelChoiceField(label=_('City'),
widget=forms.Select(attrs={'class': 'ui search dropdown'}),
queryset=City.objects.all(), required=False)
class Meta:
model …Run Code Online (Sandbox Code Playgroud) django ×10
formset ×10
python ×5
django-forms ×3
django-admin ×2
forms ×2
cleaned-data ×1
generics ×1
instance ×1
save ×1
unit-testing ×1