我正在尝试使用以下代码将自定义字段添加到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的表单.请告诉我这是否可行.如果是的话怎么样?
我写了以下自定义formset,但对于我的生活,我不知道如何保存表单.我搜索了Django文档并进行了大量搜索,但没有一个解决方案可行.很多兔子洞,但没有肉;-)有人能指出我正确的方向吗?
// views.py partial //
@login_required
def add_stats(request, group_slug, team_id, game_id, template_name = 'games/stats_add_form.html'):
if request.POST:
formset = AddStatsFormSet(group_slug=group_slug, team_id=team_id, game_id=game_id, data=request.POST)
if formset.is_valid():
formset.save()
return HttpResponseRedirect(reverse('games_game_list'))
else:
formset = TeamStatFormSet(group_slug=group_slug, team_id=team_id, game_id=game_id)
return render_to_response(template_name, {'formset': formset,})
// modles.py partial //
class PlayerStat(models.Model):
game = models.ForeignKey(Game, verbose_name=_(u'sport event'),)
player = models.ForeignKey(Player, verbose_name=_(u'player'),)
stat = models.ForeignKey(Stat, verbose_name=_(u'statistic'),)
total = models.CharField(_(u'total'), max_length=25, blank=True, null=True)
class Meta:
verbose_name = _('player stat')
verbose_name_plural = _('player stats')
db_table = 'dfusion_playerstats'
def __unicode__(self):
return u'%s' % …Run Code Online (Sandbox Code Playgroud) 我正在使用inlineformset_factory中间出勤模型为客户和会话之间的多对多关系创建字段.
我在视图文件中有以下内容:
AttendanceFormset = inlineformset_factory(
Session,
Attendance,
formset=BaseAttendanceFormSet,
exclude=('user'),
extra=1,
max_num=10,
)
session = Session(user=request.user)
formset = AttendanceFormset(request.POST, instance=session)
Run Code Online (Sandbox Code Playgroud)
并且,因为我需要覆盖其中一个表单字段,我将以下内容添加到formset基类:
class BaseAttendanceFormSet(BaseFormSet):
def add_fields(self, form, index):
super(BaseAttendanceFormSet, self).add_fields(form, index)
form.fields['client'] = forms.ModelChoiceField(
queryset=Client.objects.filter(user=2))
Run Code Online (Sandbox Code Playgroud)
现在,表单正常工作,但我需要将值传递给formset,以便我可以过滤基于当前用户显示的客户端,而不是仅使用id 2.
有人可以帮忙吗?
任何建议表示赞赏
谢谢.
编辑
对于任何读书的人来说,这对我有用:
def get_field_qs(field, **kwargs):
if field.name == 'client':
return forms.ModelChoiceField(queryset=Client.objects.filter(user=request.user))
return field.formfield(**kwargs)
Run Code Online (Sandbox Code Playgroud) 我经常遇到这个:
我想隐藏表单集中的默认删除框,并在表单集中的每个表单中清除某个字段时删除对象的实例。
典型的问题是,验证会妨碍或破坏空白表单检测并在保存表单集时开始添加所有表单(甚至是额外的空白)。
您好,我在通用 FormView 中使用了表单集,如下所示:
class RequestRecommendationView(FormView):
template_name = "account/stepfour.html"
form_class = formset_factory(StepFourForm)
def form_valid(self,form):
print form.is_valid()
cleaned_data = form.cleaned_data
# return redirect(reverse("some_url_name"))
Run Code Online (Sandbox Code Playgroud)
formset_factory 的表单如下:
class StepFourForm(forms.Form):
contact_person = forms.CharField(required=True)
email = forms.EmailField(required=True)
company = forms.CharField(required=True)
request_message = forms.CharField(required=True)
Run Code Online (Sandbox Code Playgroud)
我的html结构是这样的:
<div style="padding-top:100px;padding-left:10px;">
<h4> Request a Recommendation </h4>
<form method="post" action="">
{% csrf_token %}
<table id="myForm">
<tbody>
{% for f in form %}
{% for field in f %}
<tr>
<td>{{field.label_tag}}</td>
<td>{{field}}</td>
{% for error in field.errors %}
<td><span>{{ error }}</span></td>
{% endfor …Run Code Online (Sandbox Code Playgroud) django formset 中的初始和实例有什么区别?
什么时候用哪个?
在以下情况下,我应该使用什么来以无效形式显示预填充数据:
formset= FormSet(initial=[{'a':list.b} for list in listslist])
if request.method =='post':
formset = FormSet(request.post, ---instance/initial? ---)
Run Code Online (Sandbox Code Playgroud) 我在一个模板中有3个formset.在给定时间只能看到一个(其他两个完全隐藏):
<form style="display: none;">
Run Code Online (Sandbox Code Playgroud)
所有3个表单都使用默认值呈现,即使没有输入数据也应该有效.
但是,我想知道在验证views.py时提交了哪一个.
在views.py中,我有以下内容:
def submitted(request):
f1 = formset1(request.POST)
f2 = formset2(request.POST)
f3 = formset3(request.POST)
if f1.is_valid() or f2.is_valid() or f3.is_valid():
f1.save()
f2.save()
f3.save()
# Do a lot of calculations...
return render(request, 'submitted.html')
Run Code Online (Sandbox Code Playgroud)
问题是如果只提交了f1,我不想保存f2或f3(每个formset都有自己的提交按钮)."#做了很多计算......"部分相当广泛,我不想不必要地复制代码.
如何使用相同的视图,但仅保存并仅对提交的formset进行计算?
我想在表格的每一行上都有一个简单的文本表单。
\n\n预期结果的小提琴图:https://jsfiddle.net/wstg759f/1/
\n\n我的Models.py:
class Person(models.Model):\n name = models.CharField(max_length=30)\n\nclass Quality(models.Model):\n name = models.CharField(max_length=30)\n person=models.ForeignKey(Person)\nRun Code Online (Sandbox Code Playgroud)\n\n我有一个查询集,它返回所有人的聚合列表、每个人的品质计数、此人的一个随机品质:
\n\n[\n{\'the_count\': 5, u\'randomquality\': u\'Nice\xe2\x80\x99, u\'person__name\': u\'Joe\'}, \n{\'the_count\': 4, u\'randomquality\': u\'Generous\xe2\x80\x99,u\'person__name\': u\'Mike\'}, \n{\'the_count\': 4, u\'randomquality\': u\'Healthy\xe2\x80\x99,u\'person__name\': u\'John\xe2\x80\x99\'}, \n..\n]\nRun Code Online (Sandbox Code Playgroud)\n\n我的 view.html (质量是我的查询集)
\n\n<table>\n <thead>\n <tr>\n <th>Person</th>\n <th>Qualities count</th>\n <th>One random quality</th>\n <th>Add a Quality?</th>\n </tr>\n </thead>\n <tbody>\n {%for obj in qualities%}\n <tr>\n <td>{{ obj.person__name }}</td>\n <td>{{ obj.the_count }}</td>\n <td>{{ obj.randomquality }}</td>\n <td>text form to submit a quality for …Run Code Online (Sandbox Code Playgroud) django ×10
formset ×10
python ×5
forms ×3
django-forms ×2
ajax ×1
dynamic ×1
field ×1
validation ×1