在这个 Django Doc中,解释了如何创建一个允许您编辑属于特定作者的书籍的表单集.
我想要做的是:创建一个formset,允许您添加属于新作者的新书...在同一个formset中添加Book及其作者.
你可以点亮一盏灯吗?谢谢.
我试图保存一个formset但它似乎绕过is_valid(),即使有必要的字段.
为了测试这个我有一个简单的形式:
class AlbumForm(forms.Form):
name = forms.CharField(required=True)
Run Code Online (Sandbox Code Playgroud)
风景:
@login_required
def add_album(request, artist):
artist = Artist.objects.get(slug__iexact=artist)
AlbumFormSet = formset_factory(AlbumForm)
if request.method == 'POST':
formset = AlbumFormSet(request.POST, request.FILES)
if formset.is_valid():
return HttpResponse('worked')
else:
formset = AlbumFormSet()
return render_to_response('submissions/addalbum.html', {
'artist': artist,
'formset': formset,
}, context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)
和模板:
<form action="" method="post" enctype="multipart/form-data">{% csrf_token %}
{{ formset.management_form }}
{% for form in formset.forms %}
<ul class="addalbumlist">
{% for field in form %}
<li>
{{ field.label_tag }}
{{ field }}
{{ field.errors }}
</li>
{% endfor …Run Code Online (Sandbox Code Playgroud) 我无法访问通过我的formset提交的数据.这是我的代码:
模板:
<form action="" method="post">
{% csrf_token %}
{{ formset.management_form }}
{% for form in formset %}
{{ form.as_p }}
{% endfor %}
<input type="submit" value="Submit">
</form>
Run Code Online (Sandbox Code Playgroud)
视图:
def addMembers(request, id, members):
if request.user.is_authenticated():
members = int(members)
MemberFormSet = formset_factory(MemberForm, extra = members)
if request.method == 'POST':
print 'post'
formset = MemberFormSet(request.POST)
if formset.is_valid():
cd = formset.cleaned_data
for f in formset:
first_name = cd.first_name
last_name = cd.last_name
email = cd.email
house = House.objects.get(id = id)
member = Member(first_name = first_name, …Run Code Online (Sandbox Code Playgroud) 在 Django 中创建自定义模型管理内联时,您可以设置两个参数extra和max_num:要显示的附加表单的数量,以及允许用户附加到父对象的最大对象数。
我有一个问题模型,每个模型都可以有多个答案,这些答案在问题管理中内嵌。大多数问题都会有三个答案,所以我想默认显示三个内联;然而,当编辑一个已经有三个答案的问题时,在很可能根本没有更多答案的情况下显示三个完整的额外字段看起来很拥挤和俗气。我想要的本质上是一个min_num参数:我想默认显示至少三个字段,如果已经少于三个答案,则为空,同时仍然允许用户添加更多,然后全部显示。
我发现门票将这个既表单集和内联,但它看起来像他们还没有得到解决。目前在 Django 1.4 中有什么方便的方法可以做到这一点吗?
当我使用一个formset这既can_order和can_delete我能够得到所有被删除的形式.deleted_forms和所有非删除表格(顺序).ordered_forms。
如果我使用不使用的表单集,can_order我将不再有权访问.ordered_forms(它会引发异常)。有没有一种简单的方法来获取未删除的表单列表?
我能找到的最接近的是手动创建它:
[form for form in formset.forms if not formset._should_delete_form(form)]
Run Code Online (Sandbox Code Playgroud)
但是,这是使用“隐藏”方法,似乎很奇怪还没有内置的东西。
在我的 django 应用程序中,我有两个模型,即Player和Team,它们通过多对多关系连接。要在我的表格中动态添加数据,我想使用 javascript 在我的表单中添加Add row或Remove Row按钮,但无法这样做。
详细信息如下:
模型.py
class Player(models.Model):
pname = models.CharField(max_length=50)
hscore = models.IntegerField()
age = models.IntegerField()
def __str__(self):
return self.pname
class Team(models.Model):
tname = models.CharField(max_length=100)
player= models.ManyToManyField(Player)
def __str__(self):
return self.tname
Run Code Online (Sandbox Code Playgroud)
表格.py
class PlayerForm(forms.Form):
pname = forms.CharField()
hscore= forms.IntegerField()
age = forms.IntegerField()
PlayerFormset= formset_factory(PlayerForm)
class TeamForm(forms.Form):
tname= forms.CharField()
player= PlayerFormset()
Run Code Online (Sandbox Code Playgroud)
视图.py
def post(request):
if request.POST:
form = TeamForm(request.POST)
form.player_instances = PlayerFormset(request.POST)
if form.is_valid():
team= Team()
team.tname= form.cleaned_data['tname']
team.save() …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用以下代码将自定义字段添加到InlineFormset,但字段不会显示在Django Admin中.InlineFormset是否也被锁定以允许此操作?我的打印"ding"测试按预期触发,我可以打印出form.fields并在那里看到它们,但实际的字段永远不会在管理员中呈现.
admin.py
from django.contrib import admin
import models
from django.forms.models import BaseInlineFormSet
from django import forms
from forms import ProgressForm
from django.template.defaultfilters import slugify
class ProgressInlineFormset(BaseInlineFormSet):
def add_fields(self, form, index):
print "ding"
super(ProgressInlineFormset, self).add_fields(form, index)
for criterion in models.Criterion.objects.all():
form.fields[slugify(criterion.name)] = forms.IntegerField(label=criterion.name)
class ProgressInline(admin.TabularInline):
model = models.Progress
extra = 8
formset = ProgressInlineFormset
class ReportAdmin(admin.ModelAdmin):
list_display = ("name", "pdf_column",)
search_fields = ["name",]
inlines = (ProgressInline,)
admin.site.register(models.Report, ReportAdmin)
Run Code Online (Sandbox Code Playgroud) 我有一个作者模型和书籍模型.用户可以修改给定作者的所有书籍的属性.我希望能够为每本书显示错误,而不是列出顶部的所有错误,我该怎么做?
楷模
from django.db import models
from django.forms import ModelForm, Textarea
from django import forms
class Author(models.Model):
fname = models.CharField(max_length=100)
lname = models.CharField(max_length=100)
def fullname(self):
return '%s %s' % (self.fname, self.lname)
fullname = property(fullname)
def __unicode__(self):
return self.fullname
class Books(models.Model):
author = models.ForeignKey(Author)
title = models.CharField(max_length=50)
publisher = models.CharField(max_length=50)
edition = models.CharField(max_length=50)
comment = models.TextField()
def __unicode__(self):
return self.title
Run Code Online (Sandbox Code Playgroud)
视图
def author_books_edit(request, author_id):
a = get_object_or_404(Author, pk=author_id)
authorsbooks = a.books_set.all()
bookformset = inlineformset_factory(Author, Books, can_delete=True, can_order=True, exclude=('company',), extra=1)
formset = …Run Code Online (Sandbox Code Playgroud) 我必须制作一个使用多个formset的表单.请告诉我这是否可行.如果是的话怎么样?
好的,所以我需要对视图进行单元测试,在视图中更精确的形式.所以我创建了这样一个单元测试.
class ViewTest(TestCase):
fixtures = ['fixture.json']
def setUp(self):
self.client = Client()
def test_company_create(self):
post_data = {
'form-0-user': '',
'form-0-share': '',
'form-TOTAL_FORMS': 1,
'form-INITIAL_FORMS': 0,
'form-MAX_NUM_FORMS': 10
}
resp = self.client.post('/company/create/', post_data)
self.assertFormError (resp, 'shareholder_formset', 'share', 'This field is required.')
self.assertFormError (resp, 'shareholder_formset', 'user', 'This field is required.')
Run Code Online (Sandbox Code Playgroud)
当然我得到了一个错误
AttributeError:'ShareholderFormFormSet'对象没有属性'fields'
因为formset中有表单,而不是字段.....那么测试formset的正确方法是什么?
django ×10
formset ×10
forms ×4
python ×4
django-forms ×3
django-admin ×1
field ×1
javascript ×1
unit-testing ×1
validation ×1