Как я могу сохранить поля ForeignKey в базе данных, используя Django - PullRequest
0 голосов
/ 24 мая 2018

Я новичок в Django. У меня есть две модели: user и address, здесь у пользователя с двумя полями внешнего ключа 'localaddress', 'constantentaddress'

Модель адреса:

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>     

Здесь мне нужно визуализировать поля внешнего ключа одной формы и другой постоянный адрес формы для моего шаблона.Изначально я пробую первую форму (локальный адрес), пожалуйста, помогите мне.

Заранее спасибо ...

Скриншот формы локального адреса: здесь я сделал это Автозаполнение формы адреса, используя ссылку на адрес Google API Api.здесь Адрес автозаполнения

I am able to persist address and user object but user object creating new object it is not persisting existing object (means localaddress)

enter image description here

1 Ответ

0 голосов
/ 24 мая 2018

Я могу частично ответить о концепции в Django.

Всякий раз, когда вы создаете отношения между двумя моделями Django, вы решаете, какая модель будет основной моделью.Здесь у вас есть модель пользователя и модель адреса.Я уверен, что в большинстве случаев вы согласитесь с тем, что Модель пользователя является основной моделью, а Адрес будет подмоделью или дочерней моделью, или как вы ее называете.

Таким образом, ваше поле ForeignKey ВСЕГДА должно быть нак югу от модели.Поэтому вместо использования ForeignKey в пользовательской модели, как вы это сделали, вы должны сделать что-то вроде этого:

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)
    ...

Пожалуйста, измените структуру вашей модели и отредактируйте вопрос.Я уверен, что это то, что другие будут предлагать.

Помните, у главной модели не будет поля внешнего ключа.

Обновление: Изменена модель, чтобы позволить вам поддерживатькак локальный, так и постоянный адрес.

...