自定义表单集:-分配外键值并仅输入一次字段[登录用户] [英] Custom Formset :- Assigning foreign key value and inputting a field only once [ Logged in User ]

查看:126
本文介绍了自定义表单集:-分配外键值并仅输入一次字段[登录用户]的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个用于填充时间表模型的模型集。

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.


  1. 该Web应用程序具有登录功能。当用户(classteacher)登录时,他们可以添加时间表。我想要的是时间表(模型Form)中的classteacher字段应自动设置为user,即classteacher。 (Classteacher),并应在创建时间表后将其保存在数据库中。

我尝试将classteacher传递给formset,但是可以根据需要执行

I tried passing classteacher to formset , but it was execute as I need


我知道如何以普通形式进行操作,但是我没有在表单集中进行此操作。

I know how to do within a normal form , But I have not done this in a formset.




  1. 时间表中的日期字段应仅选择一次,因此将提供8种形式以提供开始 结束期间,但是应该只有一种表格可以提供。我成功处理了8种形式的 start end period 但不知道

  1. The day field in the Timetable should be selected only once , so there will be 8 forms to supply start end and period but there should be only one form to supply day. I succeeded in dealing 8 form for start end and period but unaware about the day.


推荐答案

还有更好的方法:


  • 如果您使用 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>

这篇关于自定义表单集:-分配外键值并仅输入一次字段[登录用户]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆