Измените размер полей в Django Admin

Используйте приведенный ниже код, это может помочь вам.

File fdelete = new File(file_dj_path);
if (fdelete.exists()) {
    if (fdelete.delete()) {
        System.out.println("file Deleted :" + file_dj_path);
    } else {
        System.out.println("file not Deleted :" + file_dj_path);
    }
}

для обновления галереи после удаления изображения используйте приведенный ниже код для отправки трансляции

(для < KITKAT API 14)

 sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
 Uri.parse("file://" +  Environment.getExternalStorageDirectory())));

Для> = KITKAT API 14 используйте приведенный ниже код

MediaScannerConnection.scanFile(this, new String[] { Environment.getExternalStorageDirectory().toString() }, null, new MediaScannerConnection.OnScanCompletedListener() {
            /*
             *   (non-Javadoc)
             * @see android.media.MediaScannerConnection.OnScanCompletedListener#onScanCompleted(java.lang.String, android.net.Uri)
             */
            public void onScanCompleted(String path, Uri uri) 
              {
                  Log.i("ExternalStorage", "Scanned " + path + ":");
                  Log.i("ExternalStorage", "-> uri=" + uri);
              }
            });

, поскольку:

ACTION_MEDIA_MOUNTED

устарело в KITKAT (API 14).


отредактировано 04-09-2015

проверка его работоспособности ниже кода

public void deleteImage() {
        String file_dj_path = Environment.getExternalStorageDirectory() + "/ECP_Screenshots/abc.jpg";
        File fdelete = new File(file_dj_path);
        if (fdelete.exists()) {
            if (fdelete.delete()) {
                Log.e("-->", "file Deleted :" + file_dj_path);
                callBroadCast();
            } else {
                Log.e("-->", "file not Deleted :" + file_dj_path);
            }
        }
    }

    public void callBroadCast() {
        if (Build.VERSION.SDK_INT >= 14) {
            Log.e("-->", " >= 14");
            MediaScannerConnection.scanFile(this, new String[]{Environment.getExternalStorageDirectory().toString()}, null, new MediaScannerConnection.OnScanCompletedListener() {
                /*
                 *   (non-Javadoc)
                 * @see android.media.MediaScannerConnection.OnScanCompletedListener#onScanCompleted(java.lang.String, android.net.Uri)
                 */
                public void onScanCompleted(String path, Uri uri) {
                    Log.e("ExternalStorage", "Scanned " + path + ":");
                    Log.e("ExternalStorage", "-> uri=" + uri);
                }
            });
        } else {
            Log.e("-->", " < 14");
            sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
                    Uri.parse("file://" + Environment.getExternalStorageDirectory())));
        }
    }

ниже - журналы

09-04 14:27:11.085    8290-8290/com.example.sampleforwear E/-->﹕ file Deleted :/storage/emulated/0/ECP_Screenshots/abc.jpg
09-04 14:27:11.085    8290-8290/com.example.sampleforwear E/-->﹕ >= 14
09-04 14:27:11.152    8290-8290/com.example.sampleforwear E/﹕ appName=com.example.sampleforwear, acAppName=/system/bin/surfaceflinger
09-04 14:27:11.152    8290-8290/com.example.sampleforwear E/﹕ 0
09-04 14:27:15.249    8290-8302/com.example.sampleforwear E/ExternalStorage﹕ Scanned /storage/emulated/0:
09-04 14:27:15.249    8290-8302/com.example.sampleforwear E/ExternalStorage﹕ -> uri=content://media/external/file/2416
103
задан Gringo Suave 29 June 2012 в 03:15
поделиться

8 ответов

Вы должны использовать ModelAdmin.formfield_overrides .

Это довольно просто - в admin.py определите:

from django.forms import TextInput, Textarea
from django.db import models

class YourModelAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.CharField: {'widget': TextInput(attrs={'size':'20'})},
        models.TextField: {'widget': Textarea(attrs={'rows':4, 'cols':40})},
    }

admin.site.register(YourModel, YourModelAdmin)
199
ответ дан 24 November 2019 в 04:13
поделиться

Если вы хотите изменить атрибуты в экземпляре для каждого поля, вы можете добавить атрибуты attrs прямо в записи формы.

например:

class BlogPostForm(forms.ModelForm):
    title = forms.CharField(label='Title:', max_length=128)
    body = forms.CharField(label='Post:', max_length=2000, 
        widget=forms.Textarea(attrs={'rows':'5', 'cols': '5'}))

    class Meta:
        model = BlogPost
        fields = ('title', 'body')

Свойство "attrs" в основном передает разметку HTML, которая корректирует поле формы. Каждая запись представляет собой кортеж атрибута, который вы хотите переопределить, и значение, которое вы хотите переопределить. Вы можете ввести столько атрибутов, сколько захотите, при условии, что вы разделяете каждый кортеж запятой.

10
ответ дан 24 November 2019 в 04:13
поделиться

Быстрый и грязный вариант - просто предоставить собственный шаблон для рассматриваемой модели.

Если вы создадите шаблон с именем admin / <ярлык приложения> / <имя класса> /change_form.html , то администратор будет использовать этот шаблон вместо шаблона по умолчанию. То есть, если у вас есть модель с именем Person в приложении с именем people , вы должны создать шаблон с именем admin / people / person / change_form.html .

Все шаблоны администратора имеют блок extrahead , который вы можете переопределить, чтобы помещать что-то в , и последний кусочек головоломки - это тот факт, что каждый поле имеет идентификатор HTML id_ .

Итак, вы можете поместить в свой шаблон что-то вроде следующего:

{% extends "admin/change_form.html" %}

{% block extrahead %}
  {{ block.super }}
  <style type="text/css">
    #id_my_field { width: 100px; }
  </style>
{% endblock %}
21
ответ дан 24 November 2019 в 04:13
поделиться

Вы можете установить произвольные атрибуты HTML для виджета, используя его свойство "attrs" .

Вы можете сделать это в админке Django с помощью formfield_for_dbfield:

class MyModelAdmin(admin.ModelAdmin):
  def formfield_for_dbfield(self, db_field, **kwargs):
    field = super(ContentAdmin, self).formfield_for_dbfield(db_field, **kwargs)
    if db_field.name == 'somefield':
      field.widget.attrs['class'] = 'someclass ' + field.widget.attrs.get('class', '')
    return field

или с настраиваемым подклассом виджетов и словарём formfield_overrides :

class DifferentlySizedTextarea(forms.Textarea):
  def __init__(self, *args, **kwargs):
    attrs = kwargs.setdefault('attrs', {})
    attrs.setdefault('cols', 80)
    attrs.setdefault('rows', 5)
    super(DifferentlySizedTextarea, self).__init__(*args, **kwargs)

class MyModelAdmin(admin.ModelAdmin):
  formfield_overrides = { models.TextField: {'widget': DifferentlySizedTextarea}}
45
ответ дан 24 November 2019 в 04:13
поделиться

Лучший способ, который я нашел, выглядит примерно так:

class NotificationForm(forms.ModelForm):
    def __init__(self, *args, **kwargs): 
        super(NotificationForm, self).__init__(*args, **kwargs)
        self.fields['content'].widget.attrs['cols'] = 80
        self.fields['content'].widget.attrs['rows'] = 15
        self.fields['title'].widget.attrs['size'] = 50
    class Meta:
        model = Notification

Это намного лучше для ModelForm, чем переопределение полей с другими виджетами, поскольку он сохраняет имя и help_text атрибуты, а также значения по умолчанию полей модели, поэтому вам не нужно копировать их в форму.

7
ответ дан 24 November 2019 в 04:13
поделиться

Это хорошо описано в FAQ Django :

Q: Как изменить атрибуты виджета в поле в моей модели?

A: Переопределите поле formfield_for_dbfield в классе ModelAdmin / StackedInline / TabularInline

class MyOtherModelInline(admin.StackedInline):
    model = MyOtherModel
    extra = 1

    def formfield_for_dbfield(self, db_field, **kwargs):
        # This method will turn all TextFields into giant TextFields
        if isinstance(db_field, models.TextField):
            return forms.CharField(widget=forms.Textarea(attrs={'cols': 130, 'rows':30, 'class': 'docx'}))
        return super(MyOtherModelInline, self).formfield_for_dbfield(db_field, **kwargs)
5
ответ дан 24 November 2019 в 04:13
поделиться

Вы всегда можете задать размеры полей в пользовательской таблице стилей и попросить Django использовать это для вашего класса ModelAdmin:

class MyModelAdmin(ModelAdmin):
    class Media:
        css = {"all": ("my_stylesheet.css",)}
5
ответ дан 24 November 2019 в 04:13
поделиться

У меня была похожая проблема с текстом. Я использую Django 1.0.2 и хотел изменить значение по умолчанию для «рядов» в связанной текстуре. Formfield_overrides не существует в этой версии. Переопределение Formfield_for_dbfield работал, но мне пришлось сделать это для каждого из моих подклассов ModelAdmin или оно приведет к ошибке рекурсии. В конце концов, я обнаружил, что добавление кода ниже на Models.py Works:

from django.forms import Textarea

class MyTextField(models.TextField):
#A more reasonably sized textarea                                                                                                            
    def formfield(self, **kwargs):
         kwargs.update(
            {"widget": Textarea(attrs={'rows':2, 'cols':80})}
         )
         return super(MyTextField, self).formfield(**kwargs)

затем используйте MyTextField вместо текстового поля при определении ваших моделей. Я адаптировал его из этого ответа к аналогичному вопросу.

7
ответ дан 24 November 2019 в 04:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: