Django-กย่อในบรรทัดเอกสาร formset-เป็นไงบ้างเพื่อตั้งค่าผู้ใช้งานปัจจุบัน

0

คำถาม

-เป้าหมายเรา- ฉันต้องการจะตั้งอยู่ในกย่อในบรรทัดเอกสาร Formset ที่ผู้ใช้งานปัจจุบันเป็นอัตโนมัติเนื้อหาของสนามของรูปแบบ. (ค่าที่ใช้ในปัจจุบันไม่ได้ทำงาน)


เวอร์ชั่น ปลั๊กอินสำหรับไพธอน 3.9.2-Django 3.2

คอนเท็กซ์: ฉันสร้างรายการอยู่ที่ไหนฉันมีสิ่ง(ส่วนหัว). จากรายการฉันสามารถสร้างใหม่ส่วนหัวและเข้าถึงข้อมูลเต็มสำหรับเรื่องหน้า(Detailview)สำหรับแต่ละคนพวกนี้โดยใช้ต่างประเทศ-กุญแจ(เรียกว่าโดย PK-primarykey).

อยู่ในหน้านี้ฉันเห็นมากก informations เรื่อง 1 เฉพาะส่วนหัว แต่ละส่วนหัวสามารถมีหลายบรรทัดขอ informations ที่ต้องการยองที่เกี่ยวข้องกับมัน ที่บรรทัดเป็นถูกสร้างหรือปรับ(แม็กซ์ 4 ต่างออก)ที่ระบุไว้ในบรรทัด@option:check Formsets.

-ปัญหาแล้วเกิดข้อผิดพลาด- ฉันสร้างแบบฟอร์มนั่นเป็นอย่างถูกต้องค่าการแสดงผล, แต่ฉันต้องการเพื่อใช้ตั้งค่าสำหรับแต่ละบรรทัดเป็นสนามนั่นโดยอัตโนมัติได้"ผู้ใช้งานปัจจุบัน"เป็นของเนื้อหาได้ที่นี่ ฉันไม่สามารถช่วยและได้รับแทนที่จะเป็น"ของผู้ใช้ไม่สามารถเป็นโพรโทคอล aimcomment".

ฉันไม่สามารถหาทางแก้ปัญหานั่นและพยายามหลายอย่างแต่ติดอยู่กับข้อผิดพลาดนี้ด้วย

ยินดีจะยินดีรับความช่วยเหลือวิธีแก้ปัญหานี้ ขอบคุณล่วงหน้า


ด้านล่างบางอย่างรหัส:

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

สำหรับรตรวจสอบบัญชีช่องข้อมูลเหมือน creator แล้ว modifier รุ่นของช่องข้อมูลฉันจะปกติแล้วตั้ง blank=True, null=True ในรุ่นของสนามนิยาม. เพียงแค่ทำอย่างนั้นรหัสของคุณจะทำงาน,เพราะเธออยู่แล้วจัดการการตั้งค่าของ dea_creator แล้ว dea_modifier ในมุมมองของคุณ.

ถ้าคุณต้องการปฏิบัติสิ่งนี้ในฐานข้อมูลเหมือนคุณกำลังทำอะไรอยู่ตอนนี้คุณจะต้องส่ง request.user ต้องของคุณ formset และตั้งมันให้เป็นจุดเริ่มต้นค่า dea_creator สนามตอนที่กำลังเริ่มการทำงานในแบบฟอร์ม

แก้ไข:

ทางเลือกทางที่ฉันพูดถึงอยู่เหนือในของคุณ HeadfttlogDeafttlogFormsetแทนที่จะเป็นการตั้งค่า fields แล้ว widgetsสร้างการริดรอนรูปแบบที่จะใช้สำหรับตัวอย่างเช่น DeafttlogFormและตั้ง fields แล้ว widgets นั่น งั้นคุณ 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

ขอบคุณ! ม"ตั้งค่าว่างเปล่า=เรื่องจริงโพรโทคอล aimcomment=เป็นความจริงนางแบบสมายความว่า"ทำงานดีและแก้ไขข้อผิดพลาดผม,ซูฉันจะได้บันทึกวัตถุ. เรื่องที่สองคือประเด็นฉันพยายามมันออกมาแต่ยังไม่ได้ดูเหมือนจะทำงานแล้ว โดยที่ฉันหมายถึงฉันพยายามจะเปลี่ยนอย่างที่คุณแนะนำและบางคนในการเต้นแต่มันเป็นปฏิเสธ\หรือแม้แต่เห็นได้ชัดว่า/n เขียนบันทึกที่ถูกทางกลับไม่สนเลยซักนิดในบันทึกโพรเซส(เห็นได้ชัดว่า)แม้แต่ตอน initialization ของรูปแบบ. คุณรู้มั้ยว่าทำไมมันเกิดขึ้น? ฉันควรจะมองยังไงที่ต้องทำให้มันแตกต่าง(ฉันหมายถึงเริ่มต้นค่า),ที่อื่นกันมั้ย
NewDevAsks1

เป็นการอธิบายจริงๆชัดเจนและช่วยได้มากเลย ตอนแรกมันไม่ได้ทำงานเดี๋ยวนี้(เห็นได้ชัดว่ามีข้อมูลบางอย่างจากคนร้ายบันทึกระหว่างการทดลองตรวจสอบเป็นกำลังสร้างบางเรื่อง),แต่ทันทีที่ฉันถูกลบออกและซ่อมมันทำงานเหมือนความมหัศจรรย์! ขอบคุณอีกครั้งสำหรับความช่วยเหลือ!
NewDevAsks1

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

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