Я создал бы класс формы динамично в функции, так, чтобы он имел доступ к филиалу через закрытие:
def make_service_form(affiliate):
class ServiceForm(forms.Form):
option = forms.ModelChoiceField(
queryset=ServiceOption.objects.filter(affiliate=affiliate))
rate = forms.DecimalField(widget=custom_widgets.SmallField())
units = forms.IntegerField(min_value=1,
widget=custom_widgets.SmallField())
return ServiceForm
В качестве награды, Вы не должны переписывать queryset в поле опции. Оборотная сторона - то, что разделение на подклассы немного броско. (Любой подкласс должен быть сделан похожим способом.)
редактирование:
В ответ на комментарий, можно вызвать эту функцию о любом месте, Вы использовали бы имя класса:
def view(request):
affiliate = get_object_or_404(id=request.GET.get('id'))
formset_cls = formset_factory(make_service_form(affiliate))
formset = formset_cls(request.POST)
...
Я не знаю конкретно об AJAX ActionLink, но со страницы WebForms можно отправить сообщение в действие MVC с помощью [AcceptVerbs (HttpVerbs.Post), ValidateAntiForgeryToken]
атрибуты.
Вы можете использовать отражение, чтобы получить доступ к методам MVC, используемым для установки cookie и сопоставления входных данных формы, используемых для проверки MVC.
См. Этот ответ: Использование MVC HtmlHelper из WebForm
Я сам не использовал никаких помощников ajax, но я не вижу причин, по которым вы не можете использовать ссылку. Лично я бы использовал обработчик события onload, чтобы ненавязчиво создать ссылку из самой формы, а затем удалить ее.
Посмотрите это сообщение в блоге .
Допустим, у вас есть метод Action, например это:
[AcceptVerbs (HttpVerbs.Post), ValidateAntiForgeryToken] общедоступный ActionResult DeleteAccount (int accountId) { // удаляем материал}
И вы вызываете его через:
$. post ('/ home / DeleteAccount', { accountId: 1000}, function () { alert ('Учетная запись удалена.'); });
Поскольку POST не включает AntiForgeryToken, он не сработает.
К счастью, это не займет много времени умственные силы, чтобы исправить это. Все клиент побочный компонент AntiForgeryToken действительно помещает токен в базовый скрытое поле. Итак, вам просто нужно вытащите эти данные и включите их в ваш вызов AJAX.
var token = $ ('input [name = __ RequestVerificationToken]'). val ();
$. post ('/ home / DeleteAccount', { accountId: 1000, '__RequestVerificationToken': токен}, function () { alert ('Учетная запись удалена.'); });
Обратите внимание, что если у вас несколько формы на странице с несколькими AntiForgeryTokens, вам нужно будет укажите, какой из них вы хотите в своем Селектор jQuery. Еще одна проблема, если вы используете jQuery
serializeArray ()
, у вас будет чтобы добавить немного иначе:
var formData = $ ('# myForm'). serializeArray (); вар токен = $ ('input [имя = __ RequestVerificationToken]'). val (); formData.push ({имя: '__RequestVerificationToken', значение: токен});
$. post ('/ home / DeleteAccount', formData, function () { alert ('Учетная запись удалена.'); });
Обновление: исправлена ссылка.