У меня модель 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.