У меня была одна и та же проблема минут назад, я столкнулся с этой проблемой после удаления неиспользуемого пользователя из таблицы 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
Я создал и использовал свои собственные универсальные классы представления, определяя __call__
, таким образом, экземпляр класса является вызываемым. Мне действительно нравится он; в то время как универсальные представления Django позволяют некоторую настройку через аргументы ключевого слова, OO универсальные представления (если их поведение разделяется на многие отдельные методы), может иметь намного более мелкомодульную настройку через разделение на подклассы, которое позволяет мне повторить меня намного меньше. (Я устаю от перезаписи того же, создают/обновляют логику представления каждый раз, когда я должен настроить что-то, что универсальные представления Django не вполне позволяют).
я отправил некоторый код в djangosnippets.org .
единственная реальная оборотная сторона, которую я вижу, является быстрым увеличением внутренних вызовов метода, которые могут повлиять на производительность несколько. Я не думаю, что это - большая часть беспокойства; редко, чтобы выполнение кода Python было бы Вашим узким местом производительности в веб-приложении.
ОБНОВЛЕНИЕ : Django, собственный универсальные представления , теперь основан на классах.
ОБНОВЛЕНИЕ : FWIW, я изменил свое мнение об основанных на классах представлениях, так как этот ответ был записан. Используя их экстенсивно на нескольких проектах, я чувствую, что они имеют тенденцию вести для кодирования, который является с удовлетворением DRY для записи, но очень трудно читать и поддержать позже, потому что функциональность распространена через такое количество различных мест и подклассов, так зависят от каждой детали реализации суперклассов и mixins. Я теперь чувствую, что TemplateResponse и просматривает декораторов, лучший ответ для разложения кода представления.
Мне нужно было использовать представления на основе классов, но я хотел иметь возможность использовать полное имя класса в 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/)
Можно всегда создавать класс, переопределять __call__
функция и затем указывать на файл URL на экземпляр класса. Можно смотреть на класс FormWizard , чтобы видеть, как это сделано.
Звуки мне как Вы пытаетесь объединить вещи, которые не должны быть объединены. Если необходимо сделать различную обработку в представлении в зависимости от того, если это - Пользователь, или Группа возражают, что Вы пытаетесь посмотреть на тогда, необходимо использовать две функции другого представления.
, С другой стороны, могут быть общие идиомы, которые Вы хотели бы извлечь из своего object_ детализируйте представления типа..., возможно, Вы могли использовать декоратора или просто функции помощника?
-Dan
Если Вы просто отображаете данные из моделей, почему бы не использовать Представления Django Generic ? Они разработаны для разрешения Вам легкие выставочные данные из модели, не имея необходимость писать Ваше собственное представление и материал об отображающихся параматерях URL к представлениям, выбирающим данным, обработав пограничные случаи, представив вывод, и т.д.
Если Вы не хотите сделать что-то, что немного комплекса, с помощью универсальных представлений является способом пойти. Они намного более мощны, чем их имя подразумевает, и если Вы просто отобразите данные модели, то универсальные представления сделают задание.
Если Вы хотите совместно использовать общую функциональность между страницами, я предлагаю, чтобы Вы посмотрели на пользовательские теги. Они вполне легки создать и очень мощны.
кроме того, шаблоны могут расшириться из других шаблонов . Это позволяет Вам иметь основной шаблон, чтобы настроить расположение страницы и совместно использовать это между другими шаблонами, которые восполняют пробелы. Можно вложить шаблоны на любую глубину; разрешение Вам определить расположение на отдельных группах связанных страниц в одном месте.
Универсальные представления обычно будут способом пойти, но в конечном счете Вы свободны обработать URL однако, Вы хотите. FormWizard делает вещи основанным на классах способом, также, как и некоторые приложения для УСПОКОИТЕЛЬНЫХ API.
В основном с URL Вам дают набор переменных и помещаете для обеспечения вызываемого, что вызываемый Вы обеспечиваете, полностью ваше дело - стандартный путь состоит в том, чтобы обеспечить функцию - но в конечном счете Django не ставит ограничений, что Вы делаете.
я действительно соглашаюсь, что еще несколько примеров того, как сделать это, были бы хороши, FormWizard является, вероятно, местом для запуска все же.