Я бы попробовал что-то вроде этого:
1) создать локальное приложение (например, delivery_date) с такой моделью, как «DeliveryDate» или около того. Например, localsite / delivery_date / models.py:
class DeliveryDate(models.Model):
product = models.ForeignKey(Product)
date = models.DateField()
order = models.ManyToManyField(Order)
class Meta:
unique_together = ("product", "date")
2) проверка максимум 20 существующих заказов ... мм, хороший вопрос, может быть, лучше всего сделать это в форме? Переопределите метод clean и проверьте, связана ли эта дата доставки с уже 20 заказами ... может быть, что-то вроде localsite / delivery_date / forms.py
class DeliveryDateForm(forms.ModelForm):
class Meta:
model = DeliveryDate
def clean(self):
super(DeliveryDateForm, self).clean()
... check here the order_set count
... но, возможно, форма не лучшее место для этого.
Вы также, вероятно, хотите скрыть и автоматически установить начальные значения для продукта и заказа самостоятельно, а пользователь должен только выбирать дату.
3) Относительно satchmo ... Я бы использовал сигналы, чтобы реагировать после добавления товара в корзину (сигнал есть только для этого случая), и добавить слушателя, который перенаправляет пользователя в представление, где он может выберите дату для этого продукта. Посмотрите на пример здесь с сигналом "cart_add_view": http://www.facebook.com/note.php?note_id=101466134049
Может быть, Ajax будет хорошим вариантом здесь. Со скрытым контейнером на вашей странице ... который появляется после добавления товара в корзину (только если у товара еще нет DeliveryDate, связанного с этим заказом / продуктом) и с просьбой выбрать дату.
Весь этот материал будет на слушателе: проверьте, нужна ли продукту дата доставки, и если да, отправьте ответ ajax, чтобы открыть всплывающее окно, и поместите в контекст repsonse форму с исходным продуктом. и закажите скрытые поля.
А чтобы сохранить дату доставки, вам понадобится другой вид ajax.
Ну, это просто идея, как бы я попытался это сделать ;-) Конечно, здесь и там, вероятно, понадобятся корректировки. Но, надеюсь, это поможет вам в дальнейшем.
С уважением,
Andrea