我写了以下自定义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) 我很难将一个formset保存到数据库中.我有两个模型,一个有一个ForeignKey到另一个(我在Django管理页面中为Balanta模型做了一些条目):
models.py
class Balanta(models.Model):
data=models.DateField()
class Meta:
ordering=['data']
verbose_name_plural="Balante"
def __unicode__(self):
return unicode(self.data)
class Conturi(models.Model):
cont=models.PositiveIntegerField()
cont_debit=models.DecimalField(default=0, max_digits=30, decimal_places=2)
cont_credit=models.DecimalField(default=0, max_digits=30, decimal_places=2)
balanta=models.ForeignKey(Balanta)
class Meta:
#ordering=['cont']
verbose_name_plural="Conturi"
def __unicode__(self):
return unicode(self.cont)
Run Code Online (Sandbox Code Playgroud)
接下来我做了一个forms.py:
from sitfin.models import Conturi, Balanta
from django.forms import ModelForm
class BalantaForm(ModelForm):
class Meta:
model=Balanta
class ConturiForm(ModelForm):
class Meta:
model=Conturi
Run Code Online (Sandbox Code Playgroud)
和views.py:
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404, render_to_response
from django.template import RequestContext
from sitfin.models import Balanta, Conturi
from sitfin.forms import BalantaForm, ConturiForm
from …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) 我想将实例列表显示为formsetwith django-crispy-forms,bootstrap其中每个实例都显示为一行,所有字段均水平排列。
我可以找到的所有示例似乎都以垂直放置其字段的方式渲染实例。
我以为使用:
helper.form_class = 'form-horizontal'
Run Code Online (Sandbox Code Playgroud)
可能有效,但这似乎没有效果。
我正在使用django-extra-views,我想用预先填充的数据填充表单及其相关的内联,然后保存(创建对象).到目前为止,我有:
from extra_views import CreateWithInlinesView
class ItemCreateView(extra_views.CreateWithInlinesView):
def dispatch(self, request, item_pk, *args, **kwargs):
self.item = models.Item.objects.get(id=item_pk)
return super(ItemCreateView, self).dispatch(
request, *args, **kwargs
)
def get_initial(self):
# Thanks to that method a form is populated with initial data.
return forms.ItemCreateForm(instance=self.item).initial
def construct_inlines(self):
# Thanks to that method a form and its inlines are prepopulated successfully.
ItemFormSet = inlineformset_factory(models.Item, models.ItemEntry, extra=0)
formset = ItemFormSet(instance=self.item)
return [formset]
Run Code Online (Sandbox Code Playgroud)
但是,尽管内联值是通过POST发送的,但是保存对象时没有内联.我究竟做错了什么?我应该初始化表单并以不同的方式内联吗?
我在一个模板中有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进行计算?
我有一个表单集,其中提供了一些初始数据 - 它是从其他模型克隆的数据,其中包含 2 个字段“组”和“请求”。
当提供初始数据时,formset 中的表单不会被保存,只有当我用数据稍微修改表单时才会保存它们。
当没有提供初始数据时,表单会被保存。
为什么将初始数据添加到表单集会导致无法将表单集数据保存到数据库?
这是我在 get_context_data 字典中存在的表单集:
initial = ProcedureActionGroup.objects.filter(procedure__id=self.kwargs.get('pk', None))
initial_values = initial.values('group', 'requested')
print initial_values
initial_count = initial.count()
ActionGroupFormset = inlineformset_factory(self.model, TaskGroup, extra=initial_count,
form=TaskActionGroupForm,
can_delete=False,
)
data['formset'] = ActionGroupFormset(self.request.POST or None, initial=initial_values,
**self.get_formset_kwargs())
Run Code Online (Sandbox Code Playgroud)
这是我保存所有数据的 form_valid 方法
def form_valid(self, form):
context = self.get_context_data()
forms = []
forms.append(form.is_valid())
if self.get_procedure_obj():
formset = context['formset']
forms.append(formset.is_valid())
if all(forms):
self.object = form.save(commit=False)
form.save()
if self.get_procedure_obj():
formset = formset.save(commit=False)
for obj in formset:
obj.task = self.object
obj.save()
self.object.extract_users()
return …Run Code Online (Sandbox Code Playgroud) 我正在尝试验证一个表单集,它完美地显示在模板中,但是当我尝试保存它时,它的验证返回 False。
我试图把一些错误回调和错误 print(formset.non_form_errors)说如下:
<bound method PhysicianSpecialtiesFormFormSet.non_form_errors of <django.forms.formsets.PhysicianSpecialtiesFormFormSet object at 0x7fd70af38a10>>
Run Code Online (Sandbox Code Playgroud)
我不知道该怎么做才能在表单中输入正确的内容;表格是一个下拉列表,不可能出错。
def UpdatePhysician(request,id):
physician = get_object_or_404(Physician, id=id)
employee = get_object_or_404(Employee, id=physician.employee.id)
person = get_object_or_404(Person, id=employee.person.id)
try:
address = get_object_or_404(Address, id=return_id(str(person.addresses.values('id'))))
except:
address = None
try:
email = get_object_or_404(Email, id=return_id(str(person.emails.values('id'))))
except:
email = None
try:
phone = get_object_or_404(PhoneNumber, id=return_id(str(person.phone_numbers.values('id'))))
except:
phone = None
try:
academic_degree = get_object_or_404(AcademicDegree, id=return_id(str(employee.academic_degrees.values('id'))))
university = get_object_or_404(University, id=return_id(str(employee.academic_degrees.values('university'))))
except:
academic_degree = None
university = None
physician_specialties = get_list_or_404(PhysicianSpecialties, employee_academic_degree__employee__pk=physician.employee.id)
for item in physician_specialties:
print(unicode(item.specialty)) …Run Code Online (Sandbox Code Playgroud) 我陷入了设计问题.
想象一下订单模型和材料模型,
class Material(models.Model):
material_code = models.CharField(max_length=40)
standard_price = models.DecimalField()
class Order(models.Model):
customer = models.ForeignKey(Customer)
class OrderItems(models.Model):
order = models.ForeignKey(Order)
material = models.ForeignKey(Material)
price = models.DecimalField()
Run Code Online (Sandbox Code Playgroud)
在我的订单详细信息视图中,我使用inlineformset_factory(Order,OrderItems)填充orderitems
我想要的行为如下:
如果用户想要添加更多订单项,我想将用户重定向到材料列表页面,用户选择一个或多个材料并确认,然后我将其重定向到新添加的项目再次订购详细信息视图.
我正在考虑这些工作,例如django管理员操作与中间页面.
在添加新的订购项目之前,我还想从物料standard_price设置订单项价格,这意味着我想在将其添加到订单项之前修改formsets值.
我想在这里问的问题是,是否有一种更简单的方法来实现这一点,似乎将formset数据存储到session并用新项重新填充formset并不容易.我会考虑另一个解决这个问题的方法.
我不想要js解决方案,想象一下我的订单模型上的字段,grandtotal,我可以计算总项目数量,用js解决方案我可能要用js做计算逻辑,用户添加项目并更改价格然后我用js做爷爷计算.这是我想要避免的.
当我使用循环渲染表单集时,一切正常。
当我尝试通过单独访问每个字段(用于前端目的)来手动呈现它时,表单正在呈现但提交失败。每个字段都是相同的,所以我猜想在使用我不知道的表单集时创建了一个隐藏字段。
这是我的工作代码的简化示例
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ formset.management_form }}
{% for p in formset %}
{{p.as_p}}
{% endfor %}
</form>
Run Code Online (Sandbox Code Playgroud)
以及一个不起作用的简化示例
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ formset.management_form }}
{% for p in formset %}
<span class="form-sub-label-container " style="vertical-align:top">
{{p.field1}}
<label class="form-sub-label" for="input_12_city" id="sublabel_12_city" style="min-height:13px"></label>
</span>
< span class="another_span">
{{p.field2}}
</span>
## etc....
{% endfor %}
</form>
Run Code Online (Sandbox Code Playgroud)
任何想法 ?
谢谢。