Принятый non-negotiables:
первым экраном должен быть очень простой низкий служебный HTML с легко identiable синглом (мудрый ботом или мудрый людьми) кнопка для нажатия или эквивалентный для указания однозначно, "Я хочу свое Дерьмо". Поскольку мы принимаем худший случай - у Вас есть эквивалент DoS-атаки от комбинации ботов и неботов, все сначала нажимают на сайт (до identfiability). Поэтому давайте раздадим их так быстро, как мы можем от кэшей, мягкого echobots, и т.д.
(Примечание: Что касается wooters, это - то, что происходит так или иначе; это столь же болезненно для пользователей что касается Woot, таким образом, что-либо, что помогает поглотить или смягчить первое экранное приобретение, в интересах всех этих 3 участвующих сторон.)
Затем процесс больше не должен ухудшать для неботов, чем это в настоящее время без дополнительных шагов (или боль) для legits. (Фоновое примечание по текущему дизайну: Текущий wooters обычно будет уже входиться в систему или может войти в систему во время процесса покупки. Новые покупатели должны зарегистрироваться во время покупки. Таким образом, это практически более быстро, чтобы быть уже зарегистрированным и более быстрое все же, чтобы уже быть зарегистрированным.)
Для завершения загаженной продажи по прогрессии экранов транзакции нужно переместиться (скажите 5, плюс или минус, в зависимости от обстоятельств). Победители являются первыми, кто завершает полную навигацию. Текущий процесс вознаграждает ботов (или кто-либо еще), кто завершает всю последовательность 5 экранов наиболее быстро; но вся прогрессия смещается к быстрым ответам (т.е. боты).
Никакой вопрос боты будут иметь преимущество для первого экрана; и безотносительно края, которого они достигли от той точки, они сохраняют через остальную часть экранов, плюс любое преимущество botness обеспечивает на других этапах также.
<час>, Что, если Woot должны были намеренно отделить процесс организации очередей после первого экрана и подать каждую сессию от той точки в последовательность шагов fixed-minimum-time? Второй экран не был бы даже представлен, пока 30 секунд не передали; после того, как это было отправлено, то же для следующих экранов. Я держал пари, что wooters не имел бы никакой проблемы, если бы им сказали, что после первого экрана они будут ожидать в очереди (который уже верен), который распределил бы нагрузку со временем способом, которая должна взять не более, чем прежде, быть более устойчивой, и справка избавляются от ботов. В этой точке можно добавить часть бота speedbumps упомянутый выше (тонкие вариации в Объектах DOM, и т.д.) Просто преимущество от восприятия, что Woot немного больше контролирует вещи, помог бы.
, Если намного более высокая пропорция хитов начальной буквы BOC могла бы непосредственно перейти в неболее дружественный для бота нестрого ограниченный во времени процесс на их первом хите (или близко к нему) вместо повторения, то у настоящих людей, которые заканчивают ту точку, было бы больше уверенности. Наверняка это было бы менее враждебно, чем текущая ситуация. Это могло бы сократить background-noise-ambient-bot-rate, это идет все время даже под нормальным Woot-прочь на обстоятельства. И боты отложили бы основную страницу и находились бы в очереди друг с другом (и все остальные), где они имеют преимущество.
<час> Хм... "Поточное квартирой" понятие приходит на ум. Интересно, полезен ли шаблон приблизительно? <час> полезное базовое понятие здесь является способностью, после первого экрана, отследить время общей суммы в очереди и смочь корректироваться к стандарту. Как стратегия смягчения бота, у Вас была бы определенная гибкость, чтобы, возможно, уклониться от очень самых ранних сессий на, возможно, 5-10 секунд; выполнение так, вероятно, было бы необнаруживаемым, но приведет к более богатому соединению покупки небота. Я уверен, что у Вас есть статистика, чтобы помочь оценить материал как это после факта. <час> Только для забавы, Вы могли (по крайней мере, для одного wootoff), соединяет Вашего собственного бота, который сочетает лучшие функции, которые Вы видели и затем раздаете его всем накануне. Затем по крайней мере все были бы одинаково вооружены. (Затем утка... поступающая...)
Простым решением может быть передача формы, которая расширяет modelform () на набор форм (а не на набор моделей).
Таким образом вы можете установить начальные значения в форме.
Я думаю, вы можете использовать начальный аргумент, как и в обычных наборах форм http://docs.djangoproject.com/en/dev/topics/forms/formsets/#using-initial-data-with-a-formset
It is still possible to pass initial to a ModelFormSet.
from django.forms.models import modelformset_factory
from example.models import ExampleModel
ExampleModelFormSet = modelformset_factory(ExampleModel)
formset = ExampleModelFormSet(initial=[{'name': 'Some Name'},
{'name': 'Another Name'}])
If this is not what your after, can you explain your question more.
EDIT:
ExampleModelFormSet = modelformset_factory(ExampleModel, extra=2)
formset = ExampleModelFormSet(queryset=ExampleModel.objects.none(),
initial=[{'name': 'Some Name'},
{'name': 'Another Name'}])
Вы передаете пустой набор запросов в ModelFormset.
ExampleModelFormSet = modelformset_factory(ExampleModel, extra=2)
formset = ExampleModelFormSet(queryset=ExampleModel.objects.none(),
initial=[{'name': 'Some Name'},
{'name': 'Another Name'}])
, что действительно является способом достижения того, чего вы хотите. Имеет смысл передать пустой набор запросов, иначе начальные значения переопределят значение базы данных модели.
И если я предполагаю, что вы передаете непустой набор запросов и все же хотите, чтобы ваши дополнительные формы были заполнены начальными значениями, вы можете переопределить Formset
.
from django.forms.models import modelformset_factory
ExampleFormset = modelformset_factory(OpenIDProfile, extra=3)
class myFormset(ExampleFormset):
def _construct_form(self, i, **kwargs):
"""
Instantiates and returns the i-th form instance in a formset.
"""
if self.is_bound and i < self.initial_form_count():
pk_key = "%s-%s" % (self.add_prefix(i), self.model._meta.pk.name)
pk = self.data[pk_key]
pk_field = self.model._meta.pk
pk = pk_field.get_db_prep_lookup('exact', pk)
if isinstance(pk, list):
pk = pk[0]
kwargs['instance'] = self._existing_object(pk)
if i < self.initial_form_count() and not kwargs.get('instance'):
kwargs['instance'] = self.get_queryset()[i]
defaults = {'auto_id': self.auto_id, 'prefix': self.add_prefix(i)}
if self.data or self.files:
defaults['data'] = self.data
defaults['files'] = self.files
# Check to confirm we are not overwriting the database value.
if not i in range(self.initial_form_count()) and self.initial:
try:
defaults['initial'] = self.initial[i - self.initial_form_count()]
except IndexError:
pass
# Allow extra forms to be empty.
if i >= self.initial_form_count():
defaults['empty_permitted'] = True
defaults.update(kwargs)
form = self.form(**defaults)
self.add_fields(form, i)
return form
Примечание: initial
- это список диктовок. Желательно, чтобы количество пунктов в списке было в точности равным количеству дополнительных.