Django-인라인 formset-을 설정하는 방법 현재 사용자

0

질문

-목표- 나는 설정해야에서,인라인 Formset,현재 사용자로 자동적인 콘텐츠의 필드의 형태이다. (현재 작동하지 않습니다)


Python3.9.2-Django3.2

Context: 내가 만든 목록을,어디서 나는 일부 개체(Headers). 목록에서 내가 만들 수 있는 새로운 헤더와 access 세부 사항 페이지(Detailview)의 각 사용하여 이러한 외국-키(에 의해 호출 PK-으).

이 페이지에서 내가 볼 수있는 더 많은 정보에 대해 1 특정 헤더가 있습니다. 각 헤더가 여러 줄의 정보에 연동되어 있어야 합니다. 라인을 만들거나 업데이트와 함께(최대 4 개의)특정한 인라인 Formsets.

문제와 오류 을 만들었는 형식을 올바르게 렌더링되는, 그러나 나는 설정해야에 대한 각 라인된 필드를 자동으로 가져옵니다"현재 사용으로"콘텐츠입니다. 나는 저장할 수 없고 받는 대신에"사용자가 null 이 될 수 없습니다".

나를 찾을 수 없는 솔루션을 고려고 많은 것을 이어폰을 사용하시기 바랍니다.이 오류가 있습니다.

것 친절하게 어떤 도움을 평가에 어떻게 이 문제를 해결합니다. 사전에 감사합니다,


아래 코드:

URLS.PY

from django.urls import path, re_path
from fttlapp import views

app_name= 'fttlapps'

urlpatterns = [
path('fttlapphome2/', views.Fttlapphome2View.as_view(), name='fttlapphome2'),
path('fttlogheader/', views.HeadfttlogListView.as_view(), name='headfttlogs'),
path('fttlogheader/add/', views.HeadfttlogCreateView.as_view(), name='headfttlogcreate'),
path('fttlogheader/<int:pk>/', views.HeadfttlogDetailView.as_view(), name='headfttlogdetail'),
path('fttlogheader/<int:pk>/flights/edit/', views.HeadfttlogDeafttlogEditView.as_view(), name='head_flight_edit'),
]

FORMS.PY

from django import forms
from django.contrib.auth.models import User
from django.db.models.fields import CharField, DateField
from django.forms import ModelForm, widgets
from django.forms.fields import ChoiceField
from django.forms.models import ModelChoiceField
from django.utils import timezone

# Load necessary to manage Form in Form
from django.forms.models import inlineformset_factory

# Load Tables
from fttlapp.models import Headfttlog, Deafttlog, Debfttlog
###############################################################################
# Forms for Headfttlog                                                        #
###############################################################################


class HeadfttlogcreateForm(ModelForm):
    class Meta:
        model = Headfttlog
        exclude = ['hea_creator', 'hea_modifier']

        widgets = {
            'hea_fttldate' : forms.TextInput(attrs={'type': 'date'}),
            'hea_nxtcheckdate' : forms.TextInput(attrs={'type': 'date'}),
            'hea_transfereddate' : forms.TextInput(attrs={'type': 'date'}),
        }
        ## Calendar widget to work both with Create and Update needs to be TextInput with type date
        ## Calendar widget not compatible with localized_fields !


###############################################################################
# Forms for Headfttlog with Deafttlog details view Management                 #
###############################################################################
HeadfttlogDeafttlogFormset = inlineformset_factory(Headfttlog, Deafttlog, 
    fields=('dea_linetype', 'dea_fttlcode', 'dea_airportfrom', 'dea_airportto',
            'dea_instrtimestart', 'dea_instrtimeend', 'dea_instrtimetot',
            'dea_blocktimestart', 'dea_blocktimeend', 'dea_blocktimetot',
            'dea_flighttimestart', 'dea_flighttimeend', 'dea_flighttimetot', 
            'dea_approach', 'dea_landing', 'dea_external', 'dea_fuel', 'dea_oil',
            'dea_lessonnotes', 'dea_preflightsignature', 'dea_invoiceaccount',
            'dea_transfered', 'dea_transfereddate',
            'dea_reccanceled', 'dea_creator', 'dea_modifier'),
    widgets={
            'dea_instrtimestart' : forms.TimeInput(format= '%H:%M', attrs={'type': 'time'}),
            'dea_instrtimeend' : forms.TimeInput(format= '%H:%M', attrs={'type': 'time'}),
            'dea_instrtimetot' : forms.TimeInput(format= '%H:%M', attrs={'type': 'time'}),
            'dea_blocktimestart' : forms.TimeInput(format= '%H:%M', attrs={'type': 'time'}),
            'dea_blocktimeend' : forms.TimeInput(format= '%H:%M', attrs={'type': 'time'}),
            'dea_blocktimetot' : forms.TimeInput(format= '%H:%M', attrs={'type': 'time'}),
            'dea_flighttimestart' : forms.TimeInput(format= '%H:%M', attrs={'type': 'time'}),
            'dea_flighttimeend' : forms.TimeInput(format= '%H:%M', attrs={'type': 'time'}),
            'dea_flighttimetot' : forms.TimeInput(format= '%H:%M', attrs={'type': 'time'}),
            'dea_reccanceled' : forms.HiddenInput,
            'dea_creator' : forms.HiddenInput,
            'dea_modifier' : forms.HiddenInput,
        }, extra=1, max_num=8)


VIEWS.PY

from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.urls import reverse
# Load necessary view
from django.views.generic import (
    TemplateView, ListView, CreateView, DetailView, FormView)
from django.views.generic.detail import SingleObjectMixin
# Load for security and access management
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.mixins import PermissionRequiredMixin
# Load functions and tools for search bar management
from fttlapp.filters import HeadfttlogFilter
import operator
from functools import partial, reduce
from django.db.models import Q
# Load functions for messages management
from django.contrib import messages
# Load Tables & Forms
from fttlapp.models import Headfttlog
from fttlapp.forms import HeadfttlogcreateForm
from fttlapp.forms import HeadfttlogDeafttlogFormset


###############################################################################
# FTTL home page management                                                   #
###############################################################################


@login_required
def fttlapphome(request):
    context = {}
    return render(request, 'fttlapp/fttlapphome.html', context)


###############################################################################
# FTTL home page 2 management                                                 #
###############################################################################

class Fttlapphome2View(TemplateView, LoginRequiredMixin):
    template_name = 'fttlapp/fttlapphome2.html'

###############################################################################
# Headfttlog - List view Management                                           #
###############################################################################


class HeadfttlogListView(ListView, LoginRequiredMixin, PermissionRequiredMixin):
    permission_required = 'fttlapp.view_headfttlog'

    model = Headfttlog
    template_name = 'fttlapp/headfttlog_list.html'
    paginate_by = 10

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        context['myFilter'] = HeadfttlogFilter(
            self.request.GET, queryset=self.get_queryset())
        return context

    # Following redefintion necessary to obtain correct pagination after Filter plugin
    def get_queryset(self):
        queryset = super().get_queryset()
        return HeadfttlogFilter(self.request.GET, queryset=queryset).qs


###############################################################################
# Headfttlog - Create view Management Headfttlog                              #
###############################################################################


class HeadfttlogCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateView):
    permission_required = 'fttlapp.add_headfttlog'

    model = Headfttlog
    template_name = 'fttlapp/headfttlogcreate_form.html'
    form_class = HeadfttlogcreateForm

    def form_valid(self, form):
        form.instance.hea_creator = self.request.user
        form.instance.hea_modifier = self.request.user
        messages.add_message(
            self.request,
            messages.SUCCESS,
            'The LOG has been created'
        )
        return super().form_valid(form)


###############################################################################
# Headfttlog - Detail view Management Headfttlog                              #
###############################################################################

class HeadfttlogDetailView(LoginRequiredMixin, PermissionRequiredMixin, DetailView):
    permission_required = 'fttlapp.view_headfttlog'

    model = Headfttlog
    template_name = 'fttlapp/headfttlogdetail.html'


###############################################################################
# Headfttlog with Deafttlog details view Management                             #
###############################################################################

class HeadfttlogDeafttlogEditView(LoginRequiredMixin, PermissionRequiredMixin, SingleObjectMixin, FormView):
    permission_required = ('fttlapp.add_headfttlog','fttlapp.change_headfttlog',
                             'fttlapp.add_deafttlog', 'fttlapp.change_deafttlog')

    model = Headfttlog
    template_name = 'fttlapp/head_flight_edit.html'

    ### 1. Identification of the single Headfttlog we will work with
    def get(self, request, *args, **kwargs):
        self.object = self.get_object(queryset=Headfttlog.objects.all())
        return super().get(request, *args, **kwargs)
    
    def post(self, request, *args, **kwargs):
        self.object = self.get_object(queryset=Headfttlog.objects.all())
        return super().post(request, *args, **kwargs)

    ### 2. FormSet creation - instance is the link to the above data. 
    def get_form(self, form_class=None):
        return HeadfttlogDeafttlogFormset(**self.get_form_kwargs(), instance=self.object)

    def formset_valid(self, form):
        form.dea_creator = self.request.user
        form.dea_modifier = self.request.user

        form.save()

        messages.add_message(
            self.request,
            messages.SUCCESS,
            'Changes were saved.'
        )

        return HttpResponseRedirect(self.get_success_url())
        
    def get_success_url(self):
        return reverse('fttlapps:headfttlogdetail', kwargs={'pk': self.object.pk})



###############################################################################
# End of view Management                                                      #
###############################################################################

HTML


{% extends 'base/dibase3.html' %}
{% load static %}

{% load crispy_forms_tags %}
{% crispy formset %}

{% block title %}Editing Flights and Instructions for {{ headfttlog.fttlcode }}{% endblock %}

{% block content %}


<style>

    .box{
        max-width: fit-content;
        margin: auto;

    }
</style>
 
</div>

<nav class="navbar navbar-expand-lg navbar-light bg-light">
    <div class="container-fluid">
      
        <div class="text-start">
          <a class="btn btn-outline-info " href="{% url 'fttlapps:headfttlogdetail' pk=headfttlog.pk %}">Back to Detail</a>
          
        </div>

     </div>
    </nav>
<hr>

<div class="container"> 

  <form action="" method="post" enctype="multipart/form-data">

    {% for hidden_field in form.hidden_fields %}
      {{ hidden_field.errors }}
      {{ hidden_field }}
    {% endfor %}

    {% csrf_token %}

    {{ form.management_form }}
    {{ form.non_form_errors }}

    <h3>Update Collection</h3>
    {% for deafttlog_form in form.forms %}
      <hr>
      <h5>
        {% if deafttlog_form.instance.id %}
          Deafttlog: {{ deafttlog_form.instance.dea_linetype }}
        {% else %}
          {% if form.forms|length > 1 %}
            Add another deafttlog
          {% else %}
            Add a deafttlog
          {% endif %}
        {% endif %}
      </h5>
      {% for hidden_field in deafttlog_form.hidden_fields %}
        {{ hidden_field.errors }}
      {% endfor %}
      <table>
        {{ deafttlog_form }}
      </table>
    {% endfor %}
    <hr>
    <p>
      <button type="submit" value="Update Flight" class="btn btn-primary w-100 mb-3">Update Flight</button>
      <a href="{{ author.get_absolute_url  }}" role="button" class="btn btn-secondary w-100">Return</a>
    </p>
  </form>

{% endblock content %}

1

최고의 응답

1

에 대한 감사 분야 creatormodifier 모델 필드가 일반적으로 설정 blank=True, null=True 모델의 필드를 정의합니다. 그냥을 수행하여하는 코드가 제대로 작동하기 때문에,당신은 이미 처리 설정 dea_creatordea_modifier 귀하의 전망이다.

을 적용하려는 경우에는 이를 데이터베이스에서 당신 같이 하고 있는 지금,당신은 당신을 통과해야 request.user 귀하의 formset 으로 설정 초기 값 dea_creator 할 때 필드를 초기화 형태입니다.

편집:

대체 방법으로,위에서 언급 한신 HeadfttlogDeafttlogFormset설정하는 대신 fieldswidgets을 만들고,실제 양식을 사용하여 예를 들어, DeafttlogForm설정 fieldswidgets 다. 그런 다음에서 당신의 formset,당신은 설정 form=DeafttlogForm.

새로 만든 DeafttlogForm초기화 dea_creator 분야:

def __init__(self, *args, **kwargs):
    user = kwargs.pop('user', None)
    super(DeafttlogForm, self).__init__(*args, **kwargs)
    instance = getattr(self, 'instance', None)
    if not instance.id and user:
        self.initial['dea_creator'] = user

다음 HeadfttlogDeafttlogEditView를 추가 get_form_kwargs 방법:

def get_form_kwargs(self):
    kwargs = super(HeadfttlogDeafttlogEditView, self).get_form_kwargs()
    kwargs['user'] = self.request.user
    return kwargs
2021-11-24 08:04:48

감사합니다! "설정 빈=True,null=True 모델의 필드를 정의"일을 완벽하게 해결하고 오류가 나는 가수 나는 할 수 마지막으로 저장하는 개체. 에 대해 두 번째,내가 그것을 밖으로 시도 하지만 여전히 보이지 않는 작동합니다. 여하는 말로 바꾸려고 노력했으로 당신은 제안과 일부 변형 하지만 그것은 거부되거나,경우에도 분명히 작성,올바른 방법으로 완전히 무시로 저장 처리(분)심지어는 초기화 하는 동안 형태입니다. 당신은 어떤 생각을 가지고 있습의 왜 이런 일이? 해 설정하는 방법에 대한 그것을 다르게(말 초기값),다른 곳에서?
NewDevAsks1

설명했다 정말 깨끗하고 도움이 됩니다. 처음에 그것은 작동하지 않은 즉시(일부 데이터가 분명히 나쁜 저장 동안의 테스트를 만드는 문제),그러나 곧 나 제거하고 수정하는 일처럼 불가사의! 다시 한번 감사합니다.
NewDevAsks1

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................