في جانغو شكل, كيف اجعل حقل للقراءة فقط (أو تعطيل) بحيث لا يمكن تحريرها?

StackOverflow https://stackoverflow.com/questions/324477

  •  11-07-2019
  •  | 
  •  

سؤال

في جانغو شكل, كيف اجعل حقل للقراءة فقط (أو تعطيل)?

عندما شكل يتم استخدامها لإنشاء إدخال جديد ، كل المجالات يجب أن يكون تمكين - ولكن عندما سجل في وضع تحديث بعض الحقول تحتاج إلى أن تكون للقراءة فقط.

على سبيل المثال ، عند إنشاء جديد Item نموذج كل المجالات يجب أن تكون قابلة للتعديل ، ولكن أثناء تحديث سجل, هل هناك طريقة لتعطيل sku المجال بحيث كان مرئيا ولكن لا يمكن تحريرها?

class Item(models.Model):
    sku = models.CharField(max_length=50)
    description = models.CharField(max_length=200)
    added_by = models.ForeignKey(User)


class ItemForm(ModelForm):
    class Meta:
        model = Item
        exclude = ('added_by')

def new_item_view(request):
    if request.method == 'POST':
        form = ItemForm(request.POST)
        # Validate and save
    else:
            form = ItemForm()
    # Render the view

يمكن أن فئة ItemForm إعادة استخدامها ؟ ما هي التغييرات التي سوف تكون مطلوبة في ItemForm أو Item نموذج الصف ؟ سوف تحتاج إلى كتابة آخر الصف،"ItemUpdateForm"،من أجل استكمال هذا البند ؟

def update_item_view(request):
    if request.method == 'POST':
        form = ItemUpdateForm(request.POST)
        # Validate and save
    else:
        form = ItemUpdateForm()
هل كانت مفيدة؟

المحلول

وكما أشار في <لأ href = "https://stackoverflow.com/questions/324477/in-a-django-form-how-do-i-make-a-field-readonly-or-disabled- لذلك بين أن ذلك يمكن أن لا / 34538169 # 34538169 "> هذه الإجابة وأضاف جانغو 1.9 في Field.disabled السمة:

<اقتباس فقرة>   

والحجة المنطقية المعوقين، عند تعيينه إلى صحيح، تعطيل حقل النموذج باستخدام المعوقين السمة HTML بحيث لن تكون قابلة للتعديل من قبل المستخدمين. حتى لو يعبث مستخدم مع قيمة الحقل إرسالها إلى الملقم، سيتم تجاهله لصالح القيمة من البيانات الأولية للنموذج.

ومع جانغو 1.8 والإصدارات السابقة، لتعطيل الدخول على موقع القطعة ومنع الخارقة وظيفة الخبيثة يجب فرك مدخلات بالإضافة إلى تعيين السمة readonly على حقل النموذج:

class ItemForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(ItemForm, self).__init__(*args, **kwargs)
        instance = getattr(self, 'instance', None)
        if instance and instance.pk:
            self.fields['sku'].widget.attrs['readonly'] = True

    def clean_sku(self):
        instance = getattr(self, 'instance', None)
        if instance and instance.pk:
            return instance.sku
        else:
            return self.cleaned_data['sku']

وأو استبدال if instance and instance.pk مع شرط آخر يشير إلى أنك تحرير. هل يمكن أيضا تعيين disabled السمة على حقل الإدخال، بدلا من readonly.

وظيفة clean_sku سيضمن لن يتم تجاوز قيمة readonly من قبل POST.

وعلى خلاف ذلك، هناك لم المدمج في حقل النموذج جانغو الذي سيجعل قيمة في حين رفض إدخال البيانات المربوطة. إذا كان هذا هو ما كنت ترغب، يجب عليك بدلا من ذلك إنشاء ModelForm منفصلة يستبعد مجال غير قابل للتحرير (ق)، وعادل طباعتها داخل القالب.

نصائح أخرى

وجانغو 1.9 أضاف السمة Field.disabled: الشبكي: / /docs.djangoproject.com/en/stable/ref/forms/fields/#disabled

<اقتباس فقرة>   

والحجة المنطقية المعوقين، عند تعيينه إلى صحيح، تعطيل حقل النموذج باستخدام المعوقين السمة HTML بحيث لن تكون قابلة للتعديل من قبل المستخدمين. حتى لو يعبث مستخدم مع قيمة الحقل إرسالها إلى الملقم، سيتم تجاهله لصالح القيمة من البيانات الأولية للنموذج.

ووضع للقراءة فقط على القطعة يجعل فقط الإدخال في المتصفح للقراءة فقط. إضافة clean_sku التي ترجع instance.sku يضمن فإن قيمة الحقل لم تتغير على مستوى النموذج.

def clean_sku(self):
    if self.instance: 
        return self.instance.sku
    else: 
        return self.fields['sku']

وبهذه الطريقة يمكنك استخدام النموذج (معدلة حفظ) ول aviod الحصول على خطأ حقل مطلوب.

<وأ href = "https://stackoverflow.com/questions/324477/in-a-django-form-how-do-i-make-a-field-readonly-or-disabled-so-that- ذلك، لا يمكن / 5238191 # 5238191 "> الجواب awalker في ساعدني كثيرا!

ولقد تغيرت مثاله للعمل مع جانغو 1.3، وذلك باستخدام <لأ href = "https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin. readonly_fields "يختلط =" noreferrer "> get_readonly_fields .

وعادة يجب أن يعلن شيئا من هذا القبيل في app/admin.py:

class ItemAdmin(admin.ModelAdmin):
    ...
    readonly_fields = ('url',)

ولقد تكيفت في هذه الطريقة:

# In the admin.py file
class ItemAdmin(admin.ModelAdmin):
    ...
    def get_readonly_fields(self, request, obj=None):
        if obj:
            return ['url']
        else:
            return []

وأنه يعمل بشكل جيد. الآن إذا قمت بإضافة عنصر، والكتابة للقراءة مجال url، ولكن على التغيير يصبح للقراءة فقط.

لجعل هذا العمل لحقل ForeignKey، تحتاج إلى إجراء بعض التغييرات. أولا، لا من سماتها SELECT HTML السمة للقراءة فقط. نحن بحاجة إلى استخدام disabled="disabled" بدلا من ذلك. ومع ذلك، فإن المتصفح لا يرسل أي بيانات النموذج مرة أخرى لهذا الحقل. لذلك نحن بحاجة إلى تعيين هذا الحقل أن لا تكون هناك حاجة بحيث بالتحقق من صحة الحقل بشكل صحيح. ثم أننا بحاجة إلى إعادة تعيين القيمة إلى ما كانت عليه حتى انها لم يتم تعيينها إلى فارغة.

وهكذا على المفاتيح الخارجية، ستحتاج أن تفعل شيئا مثل:

class ItemForm(ModelForm):

    def __init__(self, *args, **kwargs):
        super(ItemForm, self).__init__(*args, **kwargs)
        instance = getattr(self, 'instance', None)
        if instance and instance.id:
            self.fields['sku'].required = False
            self.fields['sku'].widget.attrs['disabled'] = 'disabled'

    def clean_sku(self):
        # As shown in the above answer.
        instance = getattr(self, 'instance', None)
        if instance:
            return instance.sku
        else:
            return self.cleaned_data.get('sku', None)

وبهذه الطريقة فإن المتصفح لن تسمح للمستخدم تغيير هذا المجال، وسوف POST دائما كما كان تركها فارغة. نحن ثم تجاوز أسلوب clean لتعيين قيمة للحقل أن يكون ما كان في الأصل في المقام.

لجانغو 1.2+، يمكنك تجاوز هذا المجال مثل ذلك:

sku = forms.CharField(widget = forms.TextInput(attrs={'readonly':'readonly'}))

ولقد تقدمت فئة MixIn التي قد ترث لتكون قادرة على إضافة حقل iterable READ_ONLY التي سيتم تعطيل والحقول آمنة على تحرير غير والعشرين:

و(بناء على دانيال والأجوبة Muhuk ل)

from django import forms
from django.db.models.manager import Manager

# I used this instead of lambda expression after scope problems
def _get_cleaner(form, field):
    def clean_field():
         value = getattr(form.instance, field, None)
         if issubclass(type(value), Manager):
             value = value.all()
         return value
    return clean_field

class ROFormMixin(forms.BaseForm):
    def __init__(self, *args, **kwargs):
        super(ROFormMixin, self).__init__(*args, **kwargs)
        if hasattr(self, "read_only"):
            if self.instance and self.instance.pk:
                for field in self.read_only:
                    self.fields[field].widget.attrs['readonly'] = "readonly"
                    setattr(self, "clean_" + field, _get_cleaner(self, field))

# Basic usage
class TestForm(AModelForm, ROFormMixin):
    read_only = ('sku', 'an_other_field')

ولقد خلقت فقط أبسط القطعة المحتملة لحقل للقراءة فقط - أنا في الحقيقة لا نرى لماذا أشكال لا تملك هذه بالفعل:

class ReadOnlyWidget(widgets.Widget):
    """Some of these values are read only - just a bit of text..."""
    def render(self, _, value, attrs=None):
        return value

في النموذج:

my_read_only = CharField(widget=ReadOnlyWidget())

وبسيط جدا - ويحصل لي أن الانتاج. مفيد في formset مع مجموعة من القيم قراءة فقط. بالطبع - هل يمكن أيضا أن تكون أكثر قليلا ذكي وإعطائها شعبة مع attrs حتى تتمكن من إلحاق فصول إليها

وركضت عبر مشكلة مماثلة. يبدو أنني كنت قادرا على حلها عن طريق تحديد "get_readonly_fields" الأسلوب في صفي ModelAdmin.

وشيء من هذا القبيل:

# In the admin.py file

class ItemAdmin(admin.ModelAdmin):

    def get_readonly_display(self, request, obj=None):
        if obj:
            return ['sku']
        else:
            return []

والشيء الجميل هو أن ذلك obj يكون بلا عند تقوم بإضافة عنصر جديد، أو أنه سوف يكون الكائن يتم تحريرها عند تغيير عنصر القائمة.

وتم توثيقه get_readonly_display هنا: http://docs.djangoproject.com/en/1.2/ المرجع / contrib / المشرف / # modeladmin-طرق

وخيار واحد بسيط هو فقط اكتب form.instance.fieldName في قالب بدلا من form.fieldName.

وإضافة مفيدة إلى <لأ href = "https://stackoverflow.com/questions/324477/in-a-django-form-how-do-i-make-a-field-readonly-or-disabled -حتى-أن-أن-لا / 1424453 # 1424453 "> همفري ما بعد ، وكان لي بعض القضايا مع جانغو-الارتداد، لأنه لا يزال مسجل الحقول المعوقين بأنها" تغير ". التعليمة البرمجية التالية على إصلاح المشكلة.

class ItemForm(ModelForm):

    def __init__(self, *args, **kwargs):
        super(ItemForm, self).__init__(*args, **kwargs)
        instance = getattr(self, 'instance', None)
        if instance and instance.id:
            self.fields['sku'].required = False
            self.fields['sku'].widget.attrs['disabled'] = 'disabled'

    def clean_sku(self):
        # As shown in the above answer.
        instance = getattr(self, 'instance', None)
        if instance:
            try:
                self.changed_data.remove('sku')
            except ValueError, e:
                pass
            return instance.sku
        else:
            return self.cleaned_data.get('sku', None)

وكما لا أستطيع التعليق بعد (<لأ href = "https://stackoverflow.com/questions/324477/in-a-django-form-how-do-i-make-a-field-readonly- أو تعطيل ما بين أن ذلك بنفسك، لا يمكن / 331550 # 331550 "> muhuk في حل )، وسوف أكون استجابة كما إجابة منفصلة. هذا هو مثال رمز كاملة، التي عملت بالنسبة لي:

def clean_sku(self):
  if self.instance and self.instance.pk:
    return self.instance.sku
  else:
    return self.cleaned_data['sku']

وكنت ذاهبا في نفس المشكلة لذلك أنا خلقت Mixin الذي يبدو للعمل من أجل الحالات استخدامي.

class ReadOnlyFieldsMixin(object):
    readonly_fields =()

    def __init__(self, *args, **kwargs):
        super(ReadOnlyFieldsMixin, self).__init__(*args, **kwargs)
        for field in (field for name, field in self.fields.iteritems() if name in self.readonly_fields):
            field.widget.attrs['disabled'] = 'true'
            field.required = False

    def clean(self):
        cleaned_data = super(ReadOnlyFieldsMixin,self).clean()
        for field in self.readonly_fields:
           cleaned_data[field] = getattr(self.instance, field)

        return cleaned_data

والاستخدام، مجرد تحديد تلك التي يجب أن تقرأ فقط:

class MyFormWithReadOnlyFields(ReadOnlyFieldsMixin, MyForm):
    readonly_fields = ('field1', 'field2', 'fieldx')

ولكن مرة أخرى، وانا ذاهب لتقديم واحد أكثر حل :) كنت تستخدم <لأ href = "https://stackoverflow.com/questions/324477/in-a-django-form-how-do-i- جعل واحد في حقل للقراءة فقط أو المعوقين، وذلك بين أن ذلك يمكن أن لا / 1424453 # 1424453 "> كود همفري، لذلك يستند هذا الخروج من ذلك.

ولكن، وأنا واجهت مشاكل مع الحقل كونه ModelChoiceField. أن كل شيء يعمل على الطلب الأول. ومع ذلك، إذا كان formset حاول إضافة عنصر جديد وفشل التحقق من الصحة، شيئا ما يجري خاطئ مع أشكال "القائمة"، حيث كان الخيار المحدد يتم إعادة تعيين إلى الافتراضي "---------".

وعلى أي حال، لم أتمكن من معرفة كيفية إصلاح ذلك. بدلا من ذلك، (وأنا أعتقد أن هذا هو أنظف الواقع في شكل)، ولقد تقدمت مجالات HiddenInputField (). هذا يعني فقط ما عليك القيام به لمزيد من العمل قليلا في القالب.

وهكذا كان الإصلاح بالنسبة لي لتبسيط نموذج:

class ItemForm(ModelForm):

    def __init__(self, *args, **kwargs):
        super(ItemForm, self).__init__(*args, **kwargs)
        instance = getattr(self, 'instance', None)
        if instance and instance.id:
            self.fields['sku'].widget=HiddenInput()

وبعد ذلك في قالب، ستحتاج إلى القيام ببعض <لأ href = "https://docs.djangoproject.com/en/1.3//topics/forms/modelforms/#using-the-formset-in -The-قالب "يختلط =" نوفولو noreferrer "> اليدوية حلقات من formset في .

وهكذا، في هذه الحالة يمكنك أن تفعل شيئا من هذا القبيل في القالب:

<div>
    {{ form.instance.sku }} <!-- This prints the value -->
    {{ form }} <!-- Prints form normally, and makes the hidden input -->
</div>

وهذا يعمل على نحو أفضل قليلا بالنسبة لي ومع أقل شكل التلاعب.

وكيف أفعل ذلك مع جانغو 1.11:

class ItemForm(ModelForm):
    disabled_fields = ('added_by',)

    class Meta:
        model = Item
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        super(ItemForm, self).__init__(*args, **kwargs)
        for field in self.disabled_fields:
            self.fields[field].disabled = True

واثنين آخرين (على غرار) النهج مع المثال معمم واحد:

1) أول النهج - طريقة إزالة الميداني في حفظ ()، على سبيل المثال (لم تختبر؛)):

def save(self, *args, **kwargs):
    for fname in self.readonly_fields:
        if fname in self.cleaned_data:
            del self.cleaned_data[fname]
    return super(<form-name>, self).save(*args,**kwargs)

2) النهج الثاني - إعادة تعيين الحقل المبدئي قيمة في طريقة نظيف:

def clean_<fieldname>(self):
    return self.initial[<fieldname>] # or getattr(self.instance, fieldname)

وبناء على النهج الثاني I المعمم من هذا القبيل:

from functools                 import partial

class <Form-name>(...):

    def __init__(self, ...):
        ...
        super(<Form-name>, self).__init__(*args, **kwargs)
        ...
        for i, (fname, field) in enumerate(self.fields.iteritems()):
            if fname in self.readonly_fields:
                field.widget.attrs['readonly'] = "readonly"
                field.required = False
                # set clean method to reset value back
                clean_method_name = "clean_%s" % fname
                assert clean_method_name not in dir(self)
                setattr(self, clean_method_name, partial(self._clean_for_readonly_field, fname=fname))

    def _clean_for_readonly_field(self, fname):
        """ will reset value to initial - nothing will be changed 
            needs to be added dynamically - partial, see init_fields
        """
        return self.initial[fname] # or getattr(self.instance, fieldname)

إذا كان الخاص بك تحتاج متعددة للقراءة فقط الحقول.يمكنك استخدام أي من الأساليب أدناه

الأسلوب 1

class ItemForm(ModelForm):
    readonly = ('sku',)

    def __init__(self, *arg, **kwrg):
        super(ItemForm, self).__init__(*arg, **kwrg)
        for x in self.readonly:
            self.fields[x].widget.attrs['disabled'] = 'disabled'

    def clean(self):
        data = super(ItemForm, self).clean()
        for x in self.readonly:
            data[x] = getattr(self.instance, x)
        return data

الطريقة 2

الميراث طريقة

class AdvancedModelForm(ModelForm):


    def __init__(self, *arg, **kwrg):
        super(AdvancedModelForm, self).__init__(*arg, **kwrg)
        if hasattr(self, 'readonly'):
            for x in self.readonly:
                self.fields[x].widget.attrs['disabled'] = 'disabled'

    def clean(self):
        data = super(AdvancedModelForm, self).clean()
        if hasattr(self, 'readonly'):
            for x in self.readonly:
                data[x] = getattr(self.instance, x)
        return data


class ItemForm(AdvancedModelForm):
    readonly = ('sku',)

لنسخة الادارية، وأعتقد أن هذا هو وسيلة أكثر إحكاما إذا كان لديك أكثر من مجال:

def get_readonly_fields(self, request, obj=None):
    skips = ('sku', 'other_field')
    fields = super(ItemAdmin, self).get_readonly_fields(request, obj)

    if not obj:
        return [field for field in fields if not field in skips]
    return fields

وبناء على <لأ href = "https://stackoverflow.com/questions/324477/in-a-django-form-how-do-i-make-a-field-readonly-or-disabled-so- أن ذلك بنفسك، لا يمكن / 21654713 # 21654713 "> Yamikep في الإجابة ، وجدت حلا أفضل وبسيط جدا والتي تتولى أيضا حقول ModelMultipleChoiceField.

وإزالة حقل من الحقول form.cleaned_data يمنع من يتم حفظها:

class ReadOnlyFieldsMixin(object):
    readonly_fields = ()

    def __init__(self, *args, **kwargs):
        super(ReadOnlyFieldsMixin, self).__init__(*args, **kwargs)
        for field in (field for name, field in self.fields.iteritems() if
                      name in self.readonly_fields):
            field.widget.attrs['disabled'] = 'true'
            field.required = False

    def clean(self):
        for f in self.readonly_fields:
            self.cleaned_data.pop(f, None)
        return super(ReadOnlyFieldsMixin, self).clean()

والاستعمال:

class MyFormWithReadOnlyFields(ReadOnlyFieldsMixin, MyForm):
    readonly_fields = ('field1', 'field2', 'fieldx')

وهنا هو نسخة أكثر انخراطا قليلا، استنادا <لأ href = "https://stackoverflow.com/questions/324477/in-a-django-form-how-do-i-make-a-field- للقراءة فقط أو المعوقين ما بين أن ذلك بنفسك، لا يمكن / 6789609 # 6789609 "> christophe31 في الإجابة . وهي لا تعتمد على سمة "للقراءة فقط". وهذا يجعل من مشاكلها، مثل مربعات التحديد لا يزال يجري تغيير وdatapickers لا يزال ظهرت، يذهب بعيدا.

وبدلا من ذلك، فإنه يلتف حقول النموذج القطعة في القطعة للقراءة فقط، مما يجعل شكل لا يزال التحقق من صحة. يتم عرض محتوى القطعة الأصلية داخل علامات <span class="hidden"></span>. إذا كانت القطعة لديها طريقة render_readonly() أنه يستخدم ذلك كنص واضح، وإلا فإنه يوزع HTML من القطعة الأصلية ويحاول تخمين أفضل تمثيل.

import django.forms.widgets as f
import xml.etree.ElementTree as etree
from django.utils.safestring import mark_safe

def make_readonly(form):
    """
    Makes all fields on the form readonly and prevents it from POST hacks.
    """

    def _get_cleaner(_form, field):
        def clean_field():
            return getattr(_form.instance, field, None)
        return clean_field

    for field_name in form.fields.keys():
        form.fields[field_name].widget = ReadOnlyWidget(
            initial_widget=form.fields[field_name].widget)
        setattr(form, "clean_" + field_name, 
                _get_cleaner(form, field_name))

    form.is_readonly = True

class ReadOnlyWidget(f.Select):
    """
    Renders the content of the initial widget in a hidden <span>. If the
    initial widget has a ``render_readonly()`` method it uses that as display
    text, otherwise it tries to guess by parsing the html of the initial widget.
    """

    def __init__(self, initial_widget, *args, **kwargs):
        self.initial_widget = initial_widget
        super(ReadOnlyWidget, self).__init__(*args, **kwargs)

    def render(self, *args, **kwargs):
        def guess_readonly_text(original_content):
            root = etree.fromstring("<span>%s</span>" % original_content)

            for element in root:
                if element.tag == 'input':
                    return element.get('value')

                if element.tag == 'select':
                    for option in element:
                        if option.get('selected'):
                            return option.text

                if element.tag == 'textarea':
                    return element.text

            return "N/A"

        original_content = self.initial_widget.render(*args, **kwargs)
        try:
            readonly_text = self.initial_widget.render_readonly(*args, **kwargs)
        except AttributeError:
            readonly_text = guess_readonly_text(original_content)

        return mark_safe("""<span class="hidden">%s</span>%s""" % (
            original_content, readonly_text))

# Usage example 1.
self.fields['my_field'].widget = ReadOnlyWidget(self.fields['my_field'].widget)

# Usage example 2.
form = MyForm()
make_readonly(form)

وهذا هو أبسط وسيلة؟

والحق في طريقة عرض التعليمات البرمجية شيئا من هذا القبيل:

def resume_edit(request, r_id):
    .....    
    r = Resume.get.object(pk=r_id)
    resume = ResumeModelForm(instance=r)
    .....
    resume.fields['email'].widget.attrs['readonly'] = True 
    .....
    return render(request, 'resumes/resume.html', context)

وأنه يعمل بشكل جيد!

لجانغو 1.9+
يمكنك استخدام الحقول حجة المعوقات لجعل تعطيل المجال. مثلا في اتباع التعليمات البرمجية المتكررة من ملف forms.py، لقد جعلت الحقل employee_code المعوقين

class EmployeeForm(forms.ModelForm):
    employee_code = forms.CharField(disabled=True)
    class Meta:
        model = Employee
        fields = ('employee_code', 'designation', 'salary')

والمرجعي https://docs.djangoproject.com/en/2.0/ref / أشكال / الحقول / # تعطيل

إذا كنت تعمل مع Django ver < 1.9 (وقد أضاف 1.9 السمة Field.disabled) قد تتمكن من محاولة لإضافة التالية الديكور لمن طريقة شكل __init__:

def bound_data_readonly(_, initial):
    return initial


def to_python_readonly(field):
    native_to_python = field.to_python

    def to_python_filed(_):
        return native_to_python(field.initial)

    return to_python_filed


def disable_read_only_fields(init_method):

    def init_wrapper(*args, **kwargs):
        self = args[0]
        init_method(*args, **kwargs)
        for field in self.fields.values():
            if field.widget.attrs.get('readonly', None):
                field.widget.attrs['disabled'] = True
                setattr(field, 'bound_data', bound_data_readonly)
                setattr(field, 'to_python', to_python_readonly(field))

    return init_wrapper


class YourForm(forms.ModelForm):

    @disable_read_only_fields
    def __init__(self, *args, **kwargs):
        ...

والفكرة الرئيسية هي أنه إذا كان الحقل readonly أنت لا تحتاج إلى أي قيمة أخرى باستثناء initial.

وP.S: لا تنس أن تضبط yuor_form_field.widget.attrs['readonly'] = True

إذا كنت تستخدم جانغو المشرف، وهنا هو أبسط حل.

class ReadonlyFieldsMixin(object):
    def get_readonly_fields(self, request, obj=None):
        if obj:
            return super(ReadonlyFieldsMixin, self).get_readonly_fields(request, obj)
        else:
            return tuple()

class MyAdmin(ReadonlyFieldsMixin, ModelAdmin):
    readonly_fields = ('sku',)

وأعتقد أن الخيار الأفضل أن يكون مجرد لتشمل سمة للقراءة فقط في القالب المقدمة في <span> أو <p> بدلا من إدراجه في شكل اذا كان للقراءة فقط.

وأشكال هي لجمع البيانات، وليس عرضه. أن يقال، والخيارات لعرض في القطعة readonly والبيانات فرك ما بعد حلول الجميلة.

وأنا تحل هذه المشكلة مثل هذا:

    class UploadFileForm(forms.ModelForm):
     class Meta:
      model = FileStorage
      fields = '__all__'
      widgets = {'patient': forms.HiddenInput()}

وفي وجهات النظر:

form = UploadFileForm(request.POST, request.FILES, instance=patient, initial={'patient': patient})

والأمر كله.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top