本文介绍了自定义表单集:-分配外键值并仅输入一次字段[登录用户]的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个用于填充时间表模型的模型集。
I have a modelformset to populate the timetable model.
class Timetable(models.Model):
day = models.ForeignKey('Day',on_delete=models.CASCADE)
start = models.IntegerField()
end = models.IntegerField()
period = models.CharField(max_length=12)
classteacher = models.ForeignKey('Class_teacher',on_delete=models.SET_NULL)
class Class_teacher(models.Model):
first_name = models.CharField(max_length=200)
last_name = models.CharField(max_length=200)
empid = models.CharField(max_length=10)
email = models.CharField(max_length=30)
视图
Views
class Timetableadding(CreateView):
model = Timetable
success_url = '/dashboard'
form_class = Timetableform
template_name = 'newtest.html'
def get_context_data(self, **kwargs):
context = super(Timetableadding, self).get_context_data(**kwargs)
context['formset'] = TimetableFormSet(queryset=Timetable.objects.none())
return context
def post(self, request, *args, **kwargs):
formset = TimetableFormSet(request.POST)
if formset.is_valid():
return self.form_valid(formset)
def form_valid(self, formset):
formset.classteacher = get_object_or_404(Class_teacher, email=self.request.user.email)
formset.save()
# return super().form_valid(formset)
return HttpResponseRedirect('/dashboard')
表格
Forms
class Timetableform(ModelForm):
class Meta:
model = Timetable
fields = ( 'start', 'end', 'period')
TimetableFormSet = modelformset_factory(Timetable, fields=('start', 'end', 'period'),extra=8,)
模板
Template
<form class="form-material m-t-40 floating-labels" method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ formset.management_form }}
{% for form in formset %}
{{ form }}<br><br>
{% endfor %}
<div class="form-group row">
<button type="submit" class="btn waves-effect waves-light btn-rounded btn-success">
Submit
</button>
</div>
</form>
使用createview填充时间表时,请查看开始结束时间字段
时间表
模型中的code>就像一般形式一样。
While populating the Timetableform using the createview view the fields start end period
in Timetable
model is done like a general form.
- 该Web应用程序具有登录功能。当用户(classteacher)登录时,他们可以添加时间表。我想要的是时间表(模型Form)中的classteacher字段应自动设置为user,即classteacher。 (Classteacher),并应在创建时间表后将其保存在数据库中。
我尝试将classteacher传递给formset,但是可以根据需要执行
I tried passing classteacher to formset , but it was execute as I need
-
时间表
中的日期字段应仅选择一次,因此将提供8种形式以提供开始
结束
和期间
,但是应该只有一种表格可以提供天
。我成功处理了8种形式的start
end
和period
但不知道天
。
- The day field in the
Timetable
should be selected only once , so there will be 8 forms to supplystart
end
andperiod
but there should be only one form to supplyday
. I succeeded in dealing 8 form forstart
end
andperiod
but unaware about theday
.
推荐答案
还有更好的方法:
- 如果您使用
inlineformset_factory
,则可以在初始化表单集时直接将表单集所属的教师实例传递给它。参见示例。 -
或者您可以遍历表单以便在实例保存之前对其进行修改:
- If you use an
inlineformset_factory
you can pass the teacher instance to which the form set belongs to directly when initializing the formset. See the example here. Or you can loop through the forms in order to modify the instances before they are saved:
instances = formset.save(commit=False)
for instance in instances:
instance.classteacher = ...
instance.save()
如果您希望用户提交所有实例共有的额外字段,则可以可以向视图添加另一种形式:
If you want the user to submit an extra field that is common to all instances, you can add another form to your view:
class DayForm(forms.Form):
day = ModelChoiceField(queryset=Day.objects.all())
def get_context_data(self, **kwargs):
...
context['day_form'] = DayForm()
return context
def post(self, *args, **kwargs):
...
day_form = DayForm(data=request.POST)
if formset.is_valid() and day_form.is_valid():
return self.form_valid(formset, day_form)
def form_valid(self, formset, day_form):
day = day_form.cleaned_data['day']
instances = formset.save(commit=False)
for instance in instances:
instance.day = day
instance.teacher = ...
instance.save()
return HttpResponseRedirect(...)
要渲染的模板
Template to render
<form class="form-material m-t-40 floating-labels" method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ day_form }} <br>
{{ formset.management_form }}
{% for form in formset %}
{{ form }}<br><br>
{% endfor %}
<div class="form-group row">
<button type="submit" class="btn waves-effect waves-light btn-rounded btn-success">
Submit
</button>
</div>
</form>
这篇关于自定义表单集:-分配外键值并仅输入一次字段[登录用户]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!