Страницы

Поиск по вопросам

Показаны сообщения с ярлыком django-admin. Показать все сообщения
Показаны сообщения с ярлыком django-admin. Показать все сообщения

воскресенье, 8 марта 2020 г.

Где хранить единичные данные в Django

#python #django #python_3x #django_admin #python_35


Где хранить единичные данные в Django v1.10.1 и Python v3.5, например: 


Названия сайта,
Номер телефона,
Логотип,
Описание.


И необходимо изменять через админку.
    


Ответы

Ответ 1



Что касается именно джанго, то у админки таких инструментов нет. Админка джанги - это высокоуровневый интерфейс для работы именно с базой данных. Как вариант это сделать отдельную таблицу для этих данных. Если неохота, то можно сделать самому странички для админки. Единичные данные можно хранить в любом файле. Или воспользоваться сторонними библиотеками, которые решают подобные задачи.

Ответ 2



Решил данную задачу средствами django-solo, пример: models.py: # models.py from django.db import models from solo.models import SingletonModel class SiteConfiguration(SingletonModel): site_name = models.CharField(max_length=255, default='Имя сайта ') maintenance_mode = models.BooleanField(default=False) def __unicode__(self): return u"Конфигурация Сайта" class Meta: verbose_name = "Конфигурация Сайта" admin.py: # admin.py from django.contrib import admin from solo.admin import SingletonModelAdmin from config.models import SiteConfiguration admin.site.register(SiteConfiguration, SingletonModelAdmin) views.py: # views.py from django.shortcuts import render_to_response from config.models import SiteConfiguration def main(request): ConfSiteConfiguration = SiteConfiguration.objects.all() return render_to_response('index.html', {'config': ConfSiteConfiguration}) template: {% load solo_tags %} {% get_solo 'config.SiteConfiguration' as site_config %} {{ site_config.site_name }} {{ site_config.maintenance_mode }} Код в примере взял из документации django-solo

среда, 22 января 2020 г.

Фильтрация элементов поля по общему полю в django admin

#python #django #django_admin #django_filter


изучаю django, и застрял на вопросе как сделать фильтрацию. 

Простая фильтрация с использованием filter_horizontal = ('field name') к сожалению
мне не подходит, т.к он фильтрует по имени элемента а не по общему полю( 
Нужна примерна такая реализация как это делается list_filter = ['field name'], но
т.к мое поле указывает инлайново(скрин 1), list_filter соответственно не работает.

Пример такой, у меня есть 4 элементов.


name = Белый , material = Дуб
name = Красный, material = Дуб
name = пурпурный, material = Метал
name = глянцевый, material = Метал


И мне при заполнение в Админки товара надо выдать не общим списком manyToManyField(на
скрине есть это поле) и фильтром filter_horizontal, который будет фильтровать по name,
а нужен фильтр который бы фильтровал по полю material, то есть по общему значению(скрин
2, как это реализуется стандартным list_filter. Реально ли такое реализовать? может
есть какой виджет? Пытался копать в сторону get_ordering, но не понимаю как в него
каждый раз передавать material. 





Модели models.py

#модель для вывода inlines у товара
class ImgPropertyMaterialProduct(models.Model):
   product = models.ForeignKey(Product)
   material = models.ForeignKey(MaterialPropery)
   colors = models.ManyToManyField(ImgPropertyMaterial, blank=True, verbose_name='Цвета')

#модель для заполнения property
class ImgPropertyMaterial(models.Model):
    position = models.CharField(max_length=5, verbose_name='Позиция для сортировки')
    material = models.ForeignKey(MaterialPropery)
    type = models.CharField(max_length=40, default='color', db_index=True,
                            choices=(('color', 'Цвет'), ('texture', 'Текстура')))
    value = models.CharField(max_length=40, unique=True, verbose_name='Значение')
    photo = models.ImageField(upload_to=PhotoPath('color_propery/photo'), null=True,
verbose_name='Фото')

    class Meta:
        verbose_name = 'Свойство: Изображение материала'
        verbose_name_plural = 'Свойство: Изображение материалов'

    def __str__(self):
        return self.value


И обычный горизонтальный фильтр в админки

class RowInlineTwo(admin.StackedInline):
    model = ImgPropertyMaterialProduct
    filter_horizontal = ('colors',)

    


Ответы

Ответ 1



У вас очень сумбурный текст вопроса. Я так и не смог понять, что же вам всё таки нужно - list_filter или filter_horizontal. Если первое, то всё просто: list_filter = ['colors__material'] А если надо ограничить элементы доступные в filter_horizontal, то чуточку сложнее: class ProductAdmin(admin.ModelAdmin): filter_horizontal = ['colors'] def formfield_for_manytomany(self, db_field, request, **kwargs): if db_field.name == 'colors': obj_id = request.resolver_match.kwargs['object_id'] obj = self.get_object(request, obj_id) kwargs['queryset'] = ImgPropertyMaterial.objects.filter(material=obj.material) return super().formfield_for_manytomany(db_field, request, **kwargs)

суббота, 30 ноября 2019 г.

Добавление префикса к url которые формирует django

#python #django #django_admin #django_cms


Есть middleware который проверяет url на наличие префикса в адресе и редиректит,
при его отсутствии, на адрес с префиксом. При этом заменяя значения в request так чтобы
казалось что этого префикса нету. Всё работает хорошо, за исключением того что новые
url генерируются без этого префикса, что приводит к избыточному редиректу. 

Есть ли какой-нибудь способ глобально переопределить методы для формирования url'ов,
чтобы они формировались с нужным мне префиксом? Т.е. есть модель, которая зарегистрирована
для редактирование в django админке, необходимо чтобы url'ы, которые генерирует сам
django были сразу с префиксами.

P.S. Префикс стоит перед сигнатурой языка, для этого и необходимо прикидываться.

P.S.S. Модели могут быть не моего приложения и доступа к их коду у меня нету.
    


Ответы

Ответ 1



Насколько я понял, вы хотите что-то вроде этого: # urls.py from .views import PrefixUrlRedirect old_urlpatterns = patterns('', * * * url(r'^some_view/$', some_view), ) urlpatterns = patterns('', url(r'^prefix', include(old_urlpatterns)), url(r'^(\S+)', PrefixUrlRedirect.as_view()) ) # views.py from django.views.generic.base import RedirectView from django.shortcuts import Http404 class PrefixUrlRedirect(RedirectView): query_string = True def get_redirect_url(self, *args, **kwargs): url_without_prefix = self.args[0] if not url_without_prefix.find("prefix") + 1: url = "".join(["/", "prefix", url_without_prefix]) return url else: # В случае, если url с префиксом не существует, вернём 404 raise Http404 При переходе на some_view/ перенаправит на prefixsome_view/ На prefixsome_view/ передаст управление в some_view Обратите внимание: обязателен слеш в конце каждого URL UPD Если очень хочется, можно посмотреть сюда, и переделать в виде мидлвари. Но смысла в этом не много. UPD2 Вопрос изменился, отвечаю на его вторую часть. Тут по сути два варианта: 1) Создать templatetag со своим формированием URL Смотрим как устроен штатный URL, смотрим как устроен reverse и вперёд 2) Генерировать URL в ручную выбор за вами. UPD3 Напишу подробнее: Создаём template_tag: # templatetags/my_templatetags.py from django.core.urlresolvers import reverse from django import template register = template.Library() @register.simple_tag def my_url(url_name, prefix): return prefix+reverse(url_name) В шаблоне подключаем файл с тегом через: {% load my_templatetags %} Вызываем там, где нужен URL: {% my_url "url-name" "prefix" %}

Ответ 2



Если в корневом urls.py проекта была конструкция вида urlpatterns = patterns('', ... ) , то можно заменить на old_urlpatterns = patterns('', ... ) urlpatterns = patterns('', url(r'^prefix/', include(old_urlpatterns)), )

среда, 17 июля 2019 г.

Не могу отобразить поля DateTime

Имеется модель
class BotUser(models.Model): date_in = models.DateTimeField(auto_now_add=False, auto_now=False, null=True, blank=True) date = models.DateField(auto_now=False, null=True, blank=True)
Раньше там стояло значение auto_now=True и auto_now_add=True Сейчас потребовалось отобразить их в админ панели для ручной настройки, решил изменить значения на False. Но они все равно не появляются, как быть?


Ответ

Побробуй удалить auto_now=False
class BotUser(models.Model): date_in = models.DateTimeField(auto_now_add=False, auto_now=False, null=True, blank=True) date = models.DateField(null=True, blank=True)

пятница, 12 июля 2019 г.

Фильт по значениям в django-admin

У меня есть 2 модели: class Client(models.Model): name = models.CharField(max_length=100)
def __unicode__(self): return self.name и class Discount(models.Model): discount = models.IntegerField() client = models.ForeignKey(Client) В django-admin если создавать/редактировать конкретный экземпляр Discount, поле выбора Клиента представляет из себя длинный-длинный список, по которому очень неудобно искать. Как бы сделать этот список поудобнее, желательно с функцией ввода текста, который являлся бы фильтром по данному полю, т.е. имени клиента?


Ответ

ModelAdmin.raw_id_fields raw_id_fields is a list of fields you would like to change into an Input widget for either a ForeignKey or ManyToManyField

среда, 10 июля 2019 г.

Как обработать POST запрос через admin django

Есть две модели:
class Question(models.Model): question_text = models.CharField(max_length=200) count_choice= models.IntegerField(default=0) pub_date = models.DateTimeField('date published') def __str__(self): return self.question_text
class Choice(models.Model): question = models.ForeignKey(Question, on_delete=models.CASCADE) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0) def __str__(self): return self.choice_text
Вид из admin django
Мне необходимо, что бы при создании в колонку count_choice модели question записывалось кол-во choice, как это сделать?


Ответ

В admin.py
class QuestionAdmin(admin.ModelAdmin): def save_formset(self, request, form, formset, change): super(QuestionAdmin, self).save_formset(request, form, formset, change) obj = form.save(commit=False) choices_count = Choice.objects.filter(question=obj).count() obj.count_choice=choices_count obj.save()
Обратите внимание, что в этом варианте переопределяется метод QuestionAdmin, а не ChoiceAdmin. И срабатывает он при любых операциях, не только создании. Можно добавить проверку аргумента change, но тогда count_choice будет иметь неверное значение при удалении вариантов.

вторник, 9 июля 2019 г.

Добавление кнопки в таблицу Django Admin

Мне нужно добавить кнопку в колонку таблицы Django Admin которая будет удалять запись. Кнопка должна быть у каждой записи.
models.py
class Worker (models.Model): name = models.CharField ('Name', max_length=30) surname = models.CharField ('Surname', max_length=30)
admin.py
class WorkerAdmin (admin.ModelAdmin): list_display = ('surname', 'name') search_fields = ('surname', 'name') list_filter = ('surname', 'name')
admin.site.register(Worker, WorkerAdmin)


Ответ

from django.contrib import admin from django.core.urlresolvers import reverse
@admin.register(Worker) class WorkerAdmin(admin.ModelAdmin): list_display = ('surname', 'name', 'remove_button') search_fields = ('surname', 'name') list_filter = ('surname', 'name')
def remove_button(self, obj): return 'Delete'.format(reverse('admin:workers_worker_delete', args=[obj.pk])) remove_button.short_description = '' remove_button.allow_tags = True

вторник, 28 мая 2019 г.

Где хранить единичные данные в Django

Где хранить единичные данные в Django v1.10.1 и Python v3.5, например:
Названия сайта, Номер телефона, Логотип, Описание.
И необходимо изменять через админку.


Ответ

Решил данную задачу средствами django-solo, пример:
models.py:
# models.py
from django.db import models from solo.models import SingletonModel
class SiteConfiguration(SingletonModel): site_name = models.CharField(max_length=255, default='Имя сайта ') maintenance_mode = models.BooleanField(default=False)
def __unicode__(self): return u"Конфигурация Сайта"
class Meta: verbose_name = "Конфигурация Сайта"
admin.py:
# admin.py
from django.contrib import admin from solo.admin import SingletonModelAdmin from config.models import SiteConfiguration
admin.site.register(SiteConfiguration, SingletonModelAdmin)
views.py:
# views.py
from django.shortcuts import render_to_response from config.models import SiteConfiguration
def main(request): ConfSiteConfiguration = SiteConfiguration.objects.all() return render_to_response('index.html', {'config': ConfSiteConfiguration})
template:
{% load solo_tags %} {% get_solo 'config.SiteConfiguration' as site_config %} {{ site_config.site_name }} {{ site_config.maintenance_mode }}
Код в примере взял из документации django-solo

четверг, 4 октября 2018 г.

Добавление префикса к url которые формирует django

Есть middleware который проверяет url на наличие префикса в адресе и редиректит, при его отсутствии, на адрес с префиксом. При этом заменяя значения в request так чтобы казалось что этого префикса нету. Всё работает хорошо, за исключением того что новые url генерируются без этого префикса, что приводит к избыточному редиректу.
Есть ли какой-нибудь способ глобально переопределить методы для формирования url'ов, чтобы они формировались с нужным мне префиксом? Т.е. есть модель, которая зарегистрирована для редактирование в django админке, необходимо чтобы url'ы, которые генерирует сам django были сразу с префиксами.
P.S. Префикс стоит перед сигнатурой языка, для этого и необходимо прикидываться.
P.S.S. Модели могут быть не моего приложения и доступа к их коду у меня нету.


Ответ

Насколько я понял, вы хотите что-то вроде этого:
# urls.py from .views import PrefixUrlRedirect old_urlpatterns = patterns('', * * * url(r'^some_view/$', some_view), )
urlpatterns = patterns('', url(r'^prefix', include(old_urlpatterns)), url(r'^(\S+)', PrefixUrlRedirect.as_view()) )
# views.py from django.views.generic.base import RedirectView from django.shortcuts import Http404
class PrefixUrlRedirect(RedirectView): query_string = True
def get_redirect_url(self, *args, **kwargs): url_without_prefix = self.args[0] if not url_without_prefix.find("prefix") + 1: url = "".join(["/", "prefix", url_without_prefix]) return url else: # В случае, если url с префиксом не существует, вернём 404 raise Http404
При переходе на some_view/ перенаправит на prefixsome_view/
На prefixsome_view/ передаст управление в some_view
Обратите внимание: обязателен слеш в конце каждого URL
UPD Если очень хочется, можно посмотреть сюда, и переделать в виде мидлвари. Но смысла в этом не много.
UPD2 Вопрос изменился, отвечаю на его вторую часть. Тут по сути два варианта:
1) Создать templatetag со своим формированием URL Смотрим как устроен штатный URL, смотрим как устроен reverse и вперёд
2) Генерировать URL в ручную
выбор за вами.
UPD3 Напишу подробнее:
Создаём template_tag: # templatetags/my_templatetags.py
from django.core.urlresolvers import reverse from django import template
register = template.Library()
@register.simple_tag def my_url(url_name, prefix): return prefix+reverse(url_name)
В шаблоне подключаем файл с тегом через:
{% load my_templatetags %}
Вызываем там, где нужен URL:
{% my_url "url-name" "prefix" %}

Добавление префикса к url которые формирует django

Есть middleware который проверяет url на наличие префикса в адресе и редиректит, при его отсутствии, на адрес с префиксом. При этом заменяя значения в request так чтобы казалось что этого префикса нету. Всё работает хорошо, за исключением того что новые url генерируются без этого префикса, что приводит к избыточному редиректу.
Есть ли какой-нибудь способ глобально переопределить методы для формирования url'ов, чтобы они формировались с нужным мне префиксом? Т.е. есть модель, которая зарегистрирована для редактирование в django админке, необходимо чтобы url'ы, которые генерирует сам django были сразу с префиксами.
P.S. Префикс стоит перед сигнатурой языка, для этого и необходимо прикидываться.
P.S.S. Модели могут быть не моего приложения и доступа к их коду у меня нету.


Ответ

Насколько я понял, вы хотите что-то вроде этого:
# urls.py from .views import PrefixUrlRedirect old_urlpatterns = patterns('', * * * url(r'^some_view/$', some_view), )
urlpatterns = patterns('', url(r'^prefix', include(old_urlpatterns)), url(r'^(\S+)', PrefixUrlRedirect.as_view()) )
# views.py from django.views.generic.base import RedirectView from django.shortcuts import Http404
class PrefixUrlRedirect(RedirectView): query_string = True
def get_redirect_url(self, *args, **kwargs): url_without_prefix = self.args[0] if not url_without_prefix.find("prefix") + 1: url = "".join(["/", "prefix", url_without_prefix]) return url else: # В случае, если url с префиксом не существует, вернём 404 raise Http404
При переходе на some_view/ перенаправит на prefixsome_view/
На prefixsome_view/ передаст управление в some_view
Обратите внимание: обязателен слеш в конце каждого URL
UPD Если очень хочется, можно посмотреть сюда, и переделать в виде мидлвари. Но смысла в этом не много.
UPD2 Вопрос изменился, отвечаю на его вторую часть. Тут по сути два варианта:
1) Создать templatetag со своим формированием URL Смотрим как устроен штатный URL, смотрим как устроен reverse и вперёд
2) Генерировать URL в ручную
выбор за вами.
UPD3 Напишу подробнее:
Создаём template_tag: # templatetags/my_templatetags.py
from django.core.urlresolvers import reverse from django import template
register = template.Library()
@register.simple_tag def my_url(url_name, prefix): return prefix+reverse(url_name)
В шаблоне подключаем файл с тегом через:
{% load my_templatetags %}
Вызываем там, где нужен URL:
{% my_url "url-name" "prefix" %}