Представления класса в Django

У меня была одна и та же проблема минут назад, я столкнулся с этой проблемой после удаления неиспользуемого пользователя из таблицы mysql.user, но, выполняя измененный вид, исправил ее, вот удобная команда, которая делает ее очень простой:

SELECT CONCAT("ALTER DEFINER=`youruser`@`host` VIEW ",
table_name," AS ", view_definition,";") FROM 
information_schema.views WHERE table_schema='databasename'

Смешайте это с командной строкой mysql (предполагая * nix, не знакомый с окнами):

> echo above_query | mysql -uuser -p > alterView.sql
> mysql -uuser -ppass databasename < alterView.sql

Примечание: команда генерирует и добавляет SELECT CONCAT в файл, делая mysql -uuser -ppass databasename < alterView.sql, если вы не удалите его.

Источник: https://dba.stackexchange.com/questions/4129/modify-definer-on-many-views

51
задан Community 11 September 2008 в 20:14
поделиться

8 ответов

Я создал и использовал свои собственные универсальные классы представления, определяя __call__ , таким образом, экземпляр класса является вызываемым. Мне действительно нравится он; в то время как универсальные представления Django позволяют некоторую настройку через аргументы ключевого слова, OO универсальные представления (если их поведение разделяется на многие отдельные методы), может иметь намного более мелкомодульную настройку через разделение на подклассы, которое позволяет мне повторить меня намного меньше. (Я устаю от перезаписи того же, создают/обновляют логику представления каждый раз, когда я должен настроить что-то, что универсальные представления Django не вполне позволяют).

я отправил некоторый код в djangosnippets.org .

единственная реальная оборотная сторона, которую я вижу, является быстрым увеличением внутренних вызовов метода, которые могут повлиять на производительность несколько. Я не думаю, что это - большая часть беспокойства; редко, чтобы выполнение кода Python было бы Вашим узким местом производительности в веб-приложении.

ОБНОВЛЕНИЕ : Django, собственный универсальные представления , теперь основан на классах.

ОБНОВЛЕНИЕ : FWIW, я изменил свое мнение об основанных на классах представлениях, так как этот ответ был записан. Используя их экстенсивно на нескольких проектах, я чувствую, что они имеют тенденцию вести для кодирования, который является с удовлетворением DRY для записи, но очень трудно читать и поддержать позже, потому что функциональность распространена через такое количество различных мест и подклассов, так зависят от каждой детали реализации суперклассов и mixins. Я теперь чувствую, что TemplateResponse и просматривает декораторов, лучший ответ для разложения кода представления.

42
ответ дан Pi Delport 7 November 2019 в 20:16
поделиться

Мне нужно было использовать представления на основе классов, но я хотел иметь возможность использовать полное имя класса в URLconf без необходимости всегда инстанцировать класс представления перед его использованием. Мне помог удивительно простой метакласс:

class CallableViewClass(type):
    def __call__(cls, *args, **kwargs):
        if args and isinstance(args[0], HttpRequest):
            instance = super(CallableViewClass, cls).__call__()
            return instance.__call__(*args, **kwargs)
        else:
            instance = super(CallableViewClass, cls).__call__(*args, **kwargs)
            return instance


class View(object):
    __metaclass__ = CallableViewClass

    def __call__(self, request, *args, **kwargs):
        if hasattr(self, request.method):
            handler = getattr(self, request.method)
            if hasattr(handler, '__call__'):
                return handler(request, *args, **kwargs)
        return HttpResponseBadRequest('Method Not Allowed', status=405)

Теперь я могу как инстанцировать классы представлений и использовать их экземпляры в качестве функций представления, так и просто указать в URLconf на свой класс и заставить метакласс инстанцировать (и вызывать) класс представления за меня. Это работает путем проверки первого аргумента __call__ - если это HttpRequest, то это должен быть настоящий HTTP-запрос, потому что было бы глупо пытаться инстанцировать класс представления с помощью экземпляра HttpRequest.

class MyView(View):
    def __init__(self, arg=None):
        self.arg = arg
    def GET(request):
        return HttpResponse(self.arg or 'no args provided')

@login_required
class MyOtherView(View):
    def POST(request):
        pass

# And all the following work as expected.
urlpatterns = patterns(''
    url(r'^myview1$', 'myapp.views.MyView', name='myview1'),
    url(r'^myview2$', myapp.views.MyView, name='myview2'),
    url(r'^myview3$', myapp.views.MyView('foobar'), name='myview3'),
    url(r'^myotherview$', 'myapp.views.MyOtherView', name='otherview'),
)

(я разместил сниппет для этого на http://djangosnippets.org/snippets/2041/)

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

Можно всегда создавать класс, переопределять __call__ функция и затем указывать на файл URL на экземпляр класса. Можно смотреть на класс FormWizard , чтобы видеть, как это сделано.

3
ответ дан Pi Delport 7 November 2019 в 20:16
поделиться

Звуки мне как Вы пытаетесь объединить вещи, которые не должны быть объединены. Если необходимо сделать различную обработку в представлении в зависимости от того, если это - Пользователь, или Группа возражают, что Вы пытаетесь посмотреть на тогда, необходимо использовать две функции другого представления.

, С другой стороны, могут быть общие идиомы, которые Вы хотели бы извлечь из своего object_ детализируйте представления типа..., возможно, Вы могли использовать декоратора или просто функции помощника?

-Dan

2
ответ дан 7 November 2019 в 20:16
поделиться

Если Вы просто отображаете данные из моделей, почему бы не использовать Представления Django Generic ? Они разработаны для разрешения Вам легкие выставочные данные из модели, не имея необходимость писать Ваше собственное представление и материал об отображающихся параматерях URL к представлениям, выбирающим данным, обработав пограничные случаи, представив вывод, и т.д.

10
ответ дан dfarrell07 7 November 2019 в 20:16
поделиться

Если Вы не хотите сделать что-то, что немного комплекса, с помощью универсальных представлений является способом пойти. Они намного более мощны, чем их имя подразумевает, и если Вы просто отобразите данные модели, то универсальные представления сделают задание.

2
ответ дан Harley Holcombe 7 November 2019 в 20:16
поделиться

Если Вы хотите совместно использовать общую функциональность между страницами, я предлагаю, чтобы Вы посмотрели на пользовательские теги. Они вполне легки создать и очень мощны.

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

1
ответ дан dfarrell07 7 November 2019 в 20:16
поделиться

Универсальные представления обычно будут способом пойти, но в конечном счете Вы свободны обработать URL однако, Вы хотите. FormWizard делает вещи основанным на классах способом, также, как и некоторые приложения для УСПОКОИТЕЛЬНЫХ API.

В основном с URL Вам дают набор переменных и помещаете для обеспечения вызываемого, что вызываемый Вы обеспечиваете, полностью ваше дело - стандартный путь состоит в том, чтобы обеспечить функцию - но в конечном счете Django не ставит ограничений, что Вы делаете.

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

1
ответ дан Andrew Ingram 7 November 2019 в 20:16
поделиться
Другие вопросы по тегам:

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