Я новичок в Django, у меня есть две модели: пользователь и адрес, здесь у пользователя два поля внешнего ключа: 'localaddress', 'constantaddress'
Адресная модель:
class Address(models.Model):
fulladdress = models.CharField(max_length=1000, null=True, blank=True)
additional_address = models.CharField(max_length=1000, null=True, blank=True)
street_address = models.CharField(max_length=150, null=True, blank=True)
route = models.CharField(max_length=150, null=True, blank=True)
city = models.CharField(max_length=100, null=True, blank=True)
state = models.CharField(max_length=100, null=True, blank=True)
country = models.CharField(max_length=100, null=True, blank=True)
pincode = models.IntegerField(null=True, blank=True)
class Meta:
db_table = 'address'
Модель пользователя:
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
localaddress = models.ForeignKey(Address, on_delete=models.CASCADE, related_name = "localaddress", null=True, blank=True)
permanentaddress = models.ForeignKey(Address, on_delete=models.CASCADE, related_name = "permanentaddress", null=True, blank=True)
class Meta:
db_table = 'user'
settings.py:
AUTH_USER_MODEL = 'student.User'# changes built-in user model to ours
здесь и локальный, и постоянный адрес имеют одинаковый внешний ключ (только модель адреса)
Форма редактирования:
forms.py:
class LocaladdressForm(forms.ModelForm):
class Meta:
model = Address
fields = ['fulladdress', 'additional_address', 'street_address', 'route', 'city', 'state', 'country', 'pincode']
def save(self, commit=True):
user = super(LocaladdressForm, self).save(commit=False)
user.fulladdress = self.cleaned_data['fulladdress']
user.additional_address = self.cleaned_data['additional_address']
user.street_address = self.cleaned_data['street_address']
user.route = self.cleaned_data['route']
user.city = self.cleaned_data['city']
user.state = self.cleaned_data['state']
user.pincode = self.cleaned_data['pincode']
user.country = self.cleaned_data['country']
if commit:
user.save()
return user
views.py:
def address_form(request):
if request.method == 'POST':
address = Address()
form = AddressForm(request.POST, instance=address)
if form.is_valid():
form.save()
userid = request.user.id
User.objects.filter(pk=userid).update(localaddress=address)
return redirect(reverse('student:view_profile'))
else:
args = {'form': form}
return render(request, 'student/addressform.html', args)
else:
form = AddressForm()
args = {'form': form}
return render(request, 'student/addressform.html', args)
я использую цикл for для рендеринга элементов формы, я не знаю, где я ошибся
addressform.html:
<form method = "post">
{% csrf_token %}
{{ form.fulladdress }}
{{ form.additional_address}}
{{ form.street_address}}
{{ form.street_address }}
{{ form.city }}
{{ form.state }}
{{ form.pincode }}
{{ form.country }}
</form>
Здесь мне нужно отобразить в моем шаблоне поля одного локального адреса формы и другого постоянного адреса внешнего ключа. Сначала я пробую первую форму (местный адрес), пожалуйста, помогите мне.
Заранее спасибо ...
Скриншот формы локального адреса: Здесь я сделал это Автозаполнение формы адреса, используя ссылку на API адреса Google здесь Автозаполнение адреса
I am able to persist address and user object but user object creating new object it is not persisting existing object (means localaddress)






Я могу частично ответить по поводу концепции в Django.
Всякий раз, когда вы создаете связь между двумя моделями Django, вы решаете, какая модель будет основной. Здесь у вас есть модель пользователя и модель адреса. Я уверен, что в большинстве случаев вы согласитесь с тем, что модель User является основной моделью, а Address будет подмоделью или дочерней моделью, или как вы ее называете.
Так что ваше поле ForeignKey ВСЕГДА должно быть на подмодели. Поэтому вместо того, чтобы использовать ForeignKey для модели User, как вы это сделали, вы должны сделать что-то вроде этого:
address_type_choices = [
(1, 'Local'),
(2, 'Permanent'),
]
class Address(models.Model):
user = models.ForeignKey(User)
type = models.IntegerField(default=1, choices=address_type_choices)
house = model.CharField(max_length=50)
road = model.CharField(max_length=50)
area = model.CharField(max_length=50)
...
Измените структуру вашей модели и отредактируйте вопрос. Я уверен, что это то, что предложат и другие.
Помните, что в основной модели не будет поля внешнего ключа.
Обновлять: Изменена модель, чтобы вы могли поддерживать как локальный, так и постоянный адрес.
@MiniGunnR большое спасибо за быстрый ответ здесь моя модель пользователя - это основная модель, а адрес - подмодель, я пытаюсь здесь как локальные, так и постоянные адреса, внешние ключи имеют такие поля адреса, как (адресная строка, в которой я храню улицу, город, страну, пин-код ...). Я не уверен, что это работает, но как я могу поддерживать как локальный, так и постоянный адрес, имея все поля адреса
Как я могу поддерживать модель пользователя, имеющую локальные и постоянные внешние ключи адреса (эти два поля содержат все поля модели адреса), здесь я пытаюсь установить отношения один ко многим, я не уверен, есть ли отношения один ко многим или многие ко многим
@somesh Я обновил ответ, чтобы вы могли поддерживать оба типа адресов.
@MiniGunnR Большое спасибо, я обновляю свой пост, могу проверить, как только я успешно сохраню адресный объект, но в таблице пользователя нет идентификатора адреса, здесь я создал две формы, такие как форма локального адреса и формы постоянного адреса, обе я сохраняю отдельно теперь я сохраняю локальный адрес Я пытаюсь указать здесь идентификатор адреса, чтобы сохранить соответствующий внешний ключ пользователя (поле localaddress)
Извините, я не очень четко понимаю. Если вы можете сделать нужную форму в HTML и загрузить снимок экрана, мне будет намного понятнее.
@MiniGunnR Я добавил скриншот, вы можете проверить выше один раз
@MiniGunnR Я не публикую весь свой html файл Я только разместил поля формы внутри представления Я создал новую адресную форму, как я могу сопоставить идентификатор адреса с полем локального адреса модели пользователя (означает, что всякий раз, когда я сохраняю объект адреса, этот идентификатор должен сохранять поле локального адреса в модели пользователя
@MiniGunnR Наконец, я получил решение в соответствии с моим ответом, я меняю сообщение выше, также большое спасибо за вашу ценную поддержку ...
Рад, что смог помочь.
В дополнение к этому хорошему предложению: вам не нужно добавлять поле ForeignKey в форму, потому что ваше представление должно назначать адрес правильному пользователю (
request.user). Было бы совершенно небезопасно назначать пользователя на основеid, отправленного через форму.