Сохраните имя пользователя вошедшего в систему пользователя в базе данных вместо идентификатора пользователя. - PullRequest
0 голосов
/ 03 октября 2019

Я хотел бы сохранить имя пользователя зарегистрированного пользователя в базе данных. Но только идентификатор пользователя отображается в базе данных, и я не могу понять, как изменить его на имя пользователя.

Можете ли вы помочь мне получить это?

Спасибо

Вот мой код

models.py

from django.db import models as db_models
from django.contrib.auth.models import User
from django.contrib.gis.db import models


class Fertidb(models.Model):
    user = db_models.ForeignKey(User, on_delete=models.CASCADE)
    culture = models.CharField(max_length=50)
    area = models.IntegerField()
    plot = models.FileField(upload_to='KML_FILES', blank=True)

    def __str__(self):
        return f' Parcelles de {self.user.username}'

Forms.py

from django import forms
from django.contrib.auth.models import User
from .models import Fertidb


class FertidbForm(forms.ModelForm):
    class Meta:
        model = Fertidb
        labels = {
            "plot": "Importez votre fichier KML"
        }
        fields = ['culture', 'area', 'plot']

views.py

from django.shortcuts import render, redirect
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from .forms import FertidbForm
from django.contrib.auth.models import User

title = 'FERTISAT'


@login_required
def fertisatmap(request):

    if request.method == "POST":
        o_form = FertidbForm(request.POST, request.FILES)
            if o_form.is_valid():
        fertidb = o_form.save(commit=False)
        fertidb.user = request.user  # o_form.user = request.user.username()
        fertidb.save()
        messages.success(request, f'Vos informations ont été envoyées')
        return redirect('fertisat-map')
    else:
        o_form = FertidbForm()
    context = {'title': title, 'o_form': o_form}
    return render(request, 'fertisat/fertisatmap.html ', context)

Ответы [ 2 ]

1 голос
/ 03 октября 2019

Вы НЕ хотите хранить имя пользователя в вашей модели `Fertidb̀. Ну, если быть более точным, вы ОПРЕДЕЛЕННО НЕ ХОТИТЕ хранить имя пользователя вместо идентификатора пользователя, и вероятность того, что вы действительно хотите сохранить имя пользователя в дополнение идентификатора пользователядовольно низки.

Explication: User.username является редактируемым полем, поэтому он не является жизнеспособным первичным ключом. Если вы попытаетесь использовать его как ForeignKey, ваши данные будут повреждены, как только пользователь отредактирует свое имя пользователя. OTHO, User.id - это правильный стабильный первичный ключ, так что это то, что вы хотите в качестве внешнего ключа. С этого момента вы можете довольно легко получить имя пользователя (с помощью self.user.username), И вы всегда получите актуальное значение.

Единственная причина, по которой вы хотите дублировать имя пользователя в вашей моделибудет содержать значение имени пользователя в момент создания записи fertidb . Этот вид денормализации имеет смысл в некоторых контекстах - например, в приложении для электронной коммерции сохранять цену продукта в тот момент, когда его заказывает пользователь (поэтому детали и общая сумма заказа не изменяются при последующем изменении цены вашего продукта ...), но я не вижу, как у вас возникнет такая необходимость в имени пользователя (не то, что здесь нет действительного варианта использования - просто я не могу придумать xD).

IOW: оставьте свой Foreignky на User.id- то есть RightThing (tm) - и , если у вас есть веская причина / требование для дублирования имени пользователя , сделайте это в отдельном поле.

Кроме того, учитывая ваш вопрос,Я любезно предлагаю прекратить написание кода на несколько дней, узнать о правильном моделировании реляционных баз данных и о том, как это транслируется в Django ORM. Что ж, для правильного моделирования реляционных баз данных требуется больше нескольких дней, но, по крайней мере, вы должны понять основы правильно.

0 голосов
/ 03 октября 2019

Зарегистрируйте новую модель, если вы еще этого не сделали, в admin.py:

from django.contrib import admin
from .models import Fertidb

admin.site.register(Fertidb)

Затем запустите pym manage.py makemigrations и затем python manage.py migrate.

...