Получение дополнительной информации в пользовательском интерфейсе для создания набора форм в представлении django - PullRequest
0 голосов
/ 28 мая 2018

Я не уверен, что название точно описывает то, что я хочу.У меня есть сотрудник, у которого есть метод оценки N, и оценщик, который может оценить каждый метод оценки для конкретного сотрудника на одной странице, например:

<table>
    <thead>
      <tr>
        <td>Evaluation method</td>
        <td>Value</td>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>evaluation method1</td>
        <td><input id="value_1"/></td>
        </tr> 
        <tr>
        <td>evaluation method2</td>
        <td><input id="value_2"/></td>
        </tr> 
        <tr>
        <td>evaluation method3</td>
        <td><input id="value_3"/></td>
        </tr> 
        <tr>
        <td>evaluation method4</td>
        <td><input id="value_4"/></td>
        </tr> 
     </tbody>
 </table>
<input type="submit" name="submit" value="Submit" id="submit-for-evaluations"/>

Я хочу создать один объект модели с именем QualitativeEvaluation для каждого результата, который имеет внешний ключ для модели QualitativeEvaluationMethod.Я использую набор форм модели оценки для результатов, но моя проблема в том, что я не знаю, как связать эти результаты с их QualitativeEvaluationMethod в их строке, когда я создаю их объект в своем представлении.Я предпочитаю использовать представления на основе классов.Есть ли решение при использовании formset?Или есть еще более простой способ?

1 Ответ

0 голосов
/ 25 июля 2018

Прежде всего, я определил представление создания для работы с набором форм:

class FormsetCreateView(CreateView):
    form_class = None
    template_name = None
    data = None
    employee = None

    def __init__(self, **kwargs):
    super().__init__(**kwargs)
    self.object = None

    def get_context_data(self, **kwargs):
    context = super(FormsetCreateView, self).get_context_data(**kwargs)
    if 'form' in kwargs and kwargs['form'].errors:
        context['errors'] = kwargs['form'].errors
    context['employee'] = self.employee
    return context

    def post(self, request, *args, **kwargs):
    if kwargs['formset'].is_valid():
        return self.form_valid(kwargs['formset'])
    else:
        return self.form_invalid(kwargs['formset'])

    def form_valid(self, formset):
    for i in range(len(formset) - 1):
        formset[i].save()
    return super(FormsetCreateView, self).form_valid(formset[len(formset) - 1])

    def form_invalid(self, formset):
    for form in formset:
        if form.errors:
            return super(FormsetCreateView, self).form_invalid(form)

    def get_success_url(self):
    return reverse('app:evaluator_main')

    def set_initial_data(self):
    pass

, затем я унаследовал от моего FormsetCreateView, чтобы добавить немного дополнительного поведения:

class QualitativeEvaluationCreateView(FormsetCreateView):
    form_class = QualitativeEvaluationForm
    template_name = 'evaluator/ql_evaluation.html'
    model_class = QualitativeEvaluationMethod
    extra_model = QualitativeEvaluation

    def dispatch(self, request, *args, **kwargs):
    self.employee = get_object_or_404(NormalEmployee, id=int(self.kwargs['eID']))
     //to get employee id from url
    self.data = self.set_initial_data()
    return super().dispatch(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
    context = super(QualitativeEvaluationCreateView, self).get_context_data(**kwargs)
    context['formset'] = QualitativeEvaluationFormset(initial=self.data)
    return context

    def post(self, request, *args, **kwargs):
    kwargs['formset'] = QualitativeEvaluationFormset(self.request.POST, initial=self.data)
    return super().post(request, *args, **kwargs)

    def set_initial_data(self):
    evaluation_methods = self.employee.get_unevaluated_qualitative_evaluation_methods()
    return [{'evaluation_method': c, 'employee': self.employee} for c in evaluation_methods]

моя формаи formset, как показано ниже:

class QualitativeEvaluationForm(forms.ModelForm):
    class Meta:
    model = QualitativeEvaluation
    fields = ('value', 'evaluation_method', 'employee')
    widgets = {
        'evaluation_method': forms.Select(attrs={'style': 'display:none;'}),
         // set display to none because i will show all evaluation_methods and only get their value so evaluation_method is obvious and i don't need to ask it
        'employee': forms.Select(attrs={'style': 'display:none;'}),
         // set display to none because employee which we are evaluating is obvious and i don't need to ask it
    }
QualitativeEvaluationFormset = formset_factory(QualitativeEvaluationForm, extra=0)
...