Это просто и работает с Django 1.4:
class ClientAdminForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(ClientAdminForm, self).__init__(*args, **kwargs)
# access object through self.instance...
self.fields['base_rate'].queryset = Rate.objects.filter(company=self.instance.company)
class ClientAdmin(admin.ModelAdmin):
form = ClientAdminForm
....
Вам не нужно указывать это в классе формы, но можете делать это непосредственно в ModelAdmin, поскольку Django уже включает это встроенный метод в ModelAdmin (из документов):
ModelAdmin.formfield_for_foreignkey(self, db_field, request, **kwargs)¶
'''The formfield_for_foreignkey method on a ModelAdmin allows you to
override the default formfield for a foreign keys field. For example,
to return a subset of objects for this foreign key field based on the
user:'''
class MyModelAdmin(admin.ModelAdmin):
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == "car":
kwargs["queryset"] = Car.objects.filter(owner=request.user)
return super(MyModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
. Даже более удобный способ сделать это (например, при создании интерфейса администратора администратора, к которому пользователи могут обращаться) - подклассировать ModelAdmin, а затем измените приведенные ниже методы. Конечным результатом является пользовательский интерфейс, который ТОЛЬКО показывает им контент, связанный с ними, позволяя вам (суперпользователю) видеть все.
Я переопределил четыре метода, первые два сделали это невозможно для пользователя что-либо удалить, а также удаляет кнопки удаления с сайта администратора.
Третье переопределение фильтрует любой запрос, содержащий ссылку (в примере «пользователь» или «дикобраз» (как иллюстрация).
Последнее переопределение фильтрует любое поле внешней клавиши в модели для фильтрации доступных вариантов, таких же, как и для базового набора запросов.
Таким образом, вы можете создать простой для управления фронт-админ-сайт, который позволяет пользователям общаться со своими собственными объектами, а вы не нужно помнить, чтобы вводить специальные фильтры ModelAdmin, о которых мы говорили выше.
class FrontEndAdmin(models.ModelAdmin):
def __init__(self, model, admin_site):
self.model = model
self.opts = model._meta
self.admin_site = admin_site
super(FrontEndAdmin, self).__init__(model, admin_site)
удалить кнопки «delete»:
def get_actions(self, request):
actions = super(FrontEndAdmin, self).get_actions(request)
if 'delete_selected' in actions:
del actions['delete_selected']
return actions
предотвращает разрешение на удаление
def has_delete_permission(self, request, obj=None):
return False
фильтрует объекты, которые можно просмотреть на сайте администратора:
def get_queryset(self, request):
if request.user.is_superuser:
try:
qs = self.model.objects.all()
except AttributeError:
qs = self.model._default_manager.get_queryset()
return qs
else:
try:
qs = self.model.objects.all()
except AttributeError:
qs = self.model._default_manager.get_queryset()
if hasattr(self.model, ‘user’):
return qs.filter(user=request.user)
if hasattr(self.model, ‘porcupine’):
return qs.filter(porcupine=request.user.porcupine)
else:
return qs
выбирает фильтры для всех полей foreignkey на сайте admin:
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if request.employee.is_superuser:
return super(FrontEndAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
else:
if hasattr(db_field.rel.to, 'user'):
kwargs["queryset"] = db_field.rel.to.objects.filter(user=request.user)
if hasattr(db_field.rel.to, 'porcupine'):
kwargs["queryset"] = db_field.rel.to.objects.filter(porcupine=request.user.porcupine)
return super(ModelAdminFront, self).formfield_for_foreignkey(db_field, request, **kwargs)
Прослушайте событие формы submit
- оно вызывается событиями ввода и нажатия.
Разметка
<form id="yourForm">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" value="Submit">
</form>
JS
$('#yourForm').submit(function(event){
// prevent default browser behaviour
event.preventDefault();
//do stuff with your form here
...
});
РЕДАКТИРОВАТЬ: 2. Попробуйте удалить data-keyboard = "false".
Я сделал это, когда форма отправки откроется в модальном диалоговом окне и после этого отправит всю запись в полях. Если вы нажмете кнопку «Отправить», запись будет сделана в базе данных, и страница сразу же будет перенаправлена на ту же страницу с новыми данными. Нет необходимости обновлять, чтобы увидеть последние введенные данные. Надеюсь, это поможет.
<button class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">ADD CONTENT</button>
<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h4 class="modal-title" id="myModalLabel">Please Add Content</h4>
</div>
<div class="modal-body">
<form role="form" action="" method="POST">
<!-- YOUR HTML FORM GOES HERE--->
<button type="submit" name="submit" class="btn btn-primary btn-lg"id="sub" onclick="SUBMISSION()" >Submit </button>
</fieldset>
</form>
<?php
if(isset( Я сделал это, когда форма отправки откроется в модальном диалоговом окне и после этого отправит всю запись в полях. Если вы нажмете кнопку «Отправить», запись будет сделана в базе данных, и страница сразу же будет перенаправлена на ту же страницу с новыми данными. Нет необходимости обновлять, чтобы увидеть последние введенные данные. Надеюсь, это поможет.
[110]
POST['submit']))
{
SUBMISSION();
}
function SUBMISSION()
{
// UR CONNECTION ESTABLISHMENT CODE GOES HERE
// SQL QUERY FOR INSERTION IN FIELDS
echo"<script type=\"text/javascript\">
document.location.href='http://localhost/dict/pages/YOURPAGE.php';
</script>";
$conn->CLOSE();
}
?>
</div>
</div>
<!-- /.modal-content -->
</div>
<!-- /.modal-dialog -->
<!-- /.panel-body -->
</div>
<!-- /.panel -->
</div>
<!-- /.col-lg-12 -->