Пользовательская очистка () в Model и non_field_errors для inlineformset_factory - PullRequest
1 голос
/ 28 апреля 2011

У меня модель Address похожа на;

class Address(models.Model):
    user = models.ForeignKey(Profile)
    type = models.IntegerField(choices=Address_Type, default=1, editable=False)
    street = models.CharField(max_length=128, blank=True, null=True)
    city = models.CharField(max_length=128, blank=True, null=True)
    pcode = models.CharField(max_length=128, blank=True, null=True)
    state = models.CharField(max_length=128, blank=True, null=True)
    country = models.CharField(max_length=128, default="AU", editable=False)

    def __unicode__(self):
       return '%s' % (self.user)

    def clean(self):
        if self.id:
            if self.type == 1 and self.street == '':
                raise ValidationError({NON_FIELD_ERRORS: ["Contact Address street must not me empty"]})

    class Meta:
        verbose_name = 'Address'
        verbose_name_plural = 'Addresses'

и используя следующее;

@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    if created:
        profile, new = Profile.objects.get_or_create(user=instance)
        addr, new = Address.objects.get_or_create(user=profile,type=1)
        addr, new = Address.objects.get_or_create(user=profile,type=2)

для создания профиля и 2 пустых адресных записей для пользователя.

В моих формах .py;

AddressFormSet = inlineformset_factory(Profile, Address, can_delete=False, extra=0)

и мой взгляд;

def CustomerProfileView(request):
    if not request.user.is_authenticated():
        return redirect('customer_login_view')

    template_name='customers/customer_detail.html'
    profile = get_object_or_404(Profile, user=request.user)

    if request.method == "POST":
        form = CustomerForm(request.POST, instance=profile, prefix='customer')
        addr_set = AddressFormSet(request.POST, request.FILES, instance=profile)
        if form.is_valid() and addr_set.is_valid():
            form.save()
            addr_set.save()
            return HttpResponseRedirect('summary_details')

    form = CustomerForm(instance=profile, prefix='customer')
    addr_set = CustomerFormSet(instance=profile)
    ctx = {'form': form, 'addr_set': addr_set}
    return render_to_response(template_name, ctx, context_instance=RequestContext(request))

и фрагмент из моего шаблона;

{% for form in addr_set.forms %}
                {{ form.non_field_errors }}
                {% if forloop.first %}<h3>Contact Address</h3>{% else %}<h3>Shipping Address</h3><p><i>If different form contact address.</i></p>{% endif %}
                <table border="0">
                    {% for field in form %}
                        {% if not field.is_hidden %}
                            <tr>
                                <td>{{ field.label_tag }}:</td>
                                <td>
                                    {{ field }}<br />{{ form.non_field_errors }}
                                    {% for error in field.errors %}{{ error }}{% endfor %}
                                </td>
                            </tr>
                        {% else %}<td valign="bottom">{{ field }}</td>{% endif %}
                    {% endfor %}
                </table>
            {% endfor %}

Я пытаюсь перейти к тому, чтобы 2 адресные записи создавались автоматически при регистрации пользователя, но для проверки на определенном типе адреса и только на ОБНОВЛЕНИИ, в этом случае обычный контактный адрес пользователя, другой тип предназначен для доставки и не является обязательным. Я полагаю, что я мог бы сгладить таблицы или разделить различные типы в их собственную модель, но я решил пойти по этому пути.

Функция clean () в модели Address работает до тех пор, пока она вызывает ошибку, но я не могу отобразить эту ошибку в своем шаблоне с помощью non_field_errors.

1 Ответ

0 голосов
/ 28 января 2012

Предлагаю немного рассмотреть Принцип единой ответственности . Контактный адрес и адрес доставки - это две разные проблемы, которые, вероятно, заслуживают разного обращения, возможно, даже разной схемы постоянства в зависимости от требований вашего бизнеса. В этой системе вы объединили их в одну модель. Это поле типа, которое поднимает красный флаг для меня. Вы также можете иметь две модели и избавить от необходимости иметь дело с различными требованиями к валидации из одной и той же модели, что и является причиной вашего вопроса. В этот момент существуют другие проблемы проверки адресов, которые необходимо учитывать ...

Кстати, я разрабатываю программное обеспечение для компании по проверке адресов, SmartyStreets . Дайте мне знать, если у вас есть дополнительные вопросы или комментарии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...