• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Django - problem z walidacja formy i ForeignKey.

Object Storage Arubacloud
0 głosów
131 wizyt
pytanie zadane 6 października 2020 w Python przez Ventre90 Obywatel (1,170 p.)
zamknięte 8 października 2020 przez Ventre90

Cześć wszystkim,

Pisze aplikacje ToDo lista z mozliwoscia logowania się. Chciałbym aby każdy user miał swoją indywidualną listę po zalogowaniu się.

Problem: Gdy dodaje taksa z panelu admina to wszystko jest widoczne dla poszczególnych userów (moge tez usuwać i edytować taski). Nie moge jednak dodać taska za pomocą forma w aplikacji. Przestało działać jak dodałem do modelu Task pole: models.ForeignKey(User, on_delete=models.CASCADE). Robiąc testy co nie działa doszedłem do wniosku, że if forms.isvalid() - nie jest True i forma sie nie zapisuje ale nie wiem dlaczego. 

Czy powinienem dodać jakieś query o ForeignKey do formy ?

Model:

from django.contrib.auth.models import User

class Task(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=500)
    created_time = models.DateTimeField(auto_now_add=True)
    status = models.BooleanField(default=False)

    def __str__(self):
        return self.title

Forma:

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

class TaskForm(forms.ModelForm):
    
    class Meta:
        model = Task
        fields = '__all__'

class CreateAccount(UserCreationForm):

    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']

Widok:

@login_required(login_url='login')
def tasks_list(request):
    #tasks = Task.objects.all()
    tasks = Task.objects.filter(owner=request.user)
    form = TaskForm()

    if request.method =='POST':
        form = TaskForm(request.POST)
        if form.is_valid():
            form.save()
        return redirect('/')

    context = {
        'tasks': tasks,
        'form': form,
    }
    return render(request, 'todo/base.html', context)

 

komentarz zamknięcia: Temat rozwiązany

1 odpowiedź

+1 głos
odpowiedź 6 października 2020 przez Nelson89 Dyskutant (7,720 p.)
wybrane 6 października 2020 przez Ventre90
 
Najlepsza

Cześć,

Formularz na stronie, który Ci się wyświetla ma pole owner? Bo bez wypełnienia tego pola forma nie będzie zwalidowana.

Dlatego musiałbyś edytować klasę TaskForm. W zmiennej fields podaj w liście wszystkie atrybuty modelu z wyjątkiem owner.  Następnie, gdy forma jest zwalidowana wyciągasz poszczególne wartości ze słownika form.data[„<klucz”>]
Użytkownika wyciągasz z requestu. Mając te wartości możesz utworzyć nowy obiekt Task i zapisać go z wykorzystaniem atrybutu save().

np.

from .models import Task


...

    if form.is_valid():
        user = requests.user
        title = form.data[„title”]
        ...
        task = Task(owner=user, title=title, ....)
        task.save()
        
        return ...
....

Pozdrawiam,

Nelson

komentarz 6 października 2020 przez Ventre90 Obywatel (1,170 p.)

@Nelson Twoja pomoc znów okazała się bezcenna. Po tym jak wytłumaczyłeś o co dokładnie chodzi z tą formą już sobie to naprawiłem i wszystko działa jak powinno. Poczytałem też o temacie trochę w dokumentacji ( bo wcześniej szukałem na ślepo bo nie wiedziałem dokładnie czego szukać). Teraz tak to wygląda i działa:

Forma:

class TaskForm(forms.ModelForm):
    
    class Meta:
        model = Task
        #fields = '__all__'
        #fields = ['title','status']
        exclude = ['owner']

Widok:

@login_required(login_url='login')
def tasks_list(request):
    #tasks = Task.objects.all()
    tasks = Task.objects.filter(owner=request.user)
    form = TaskForm()

    if request.method =='POST':
        form = TaskForm(request.POST)
        if form.is_valid():
            task_instance = form.save(commit=False)
            task_instance.owner = request.user
            task_instance.save()
        return redirect('/')

    context = {
        'tasks': tasks,
        'form': form,
    }
    return render(request, 'todo/base.html', context)
komentarz 6 października 2020 przez Nelson89 Dyskutant (7,720 p.)
Elegancko

Podobne pytania

0 głosów
0 odpowiedzi 264 wizyt
pytanie zadane 3 sierpnia 2019 w Python przez reaktywny Nałogowiec (40,990 p.)
0 głosów
1 odpowiedź 496 wizyt
pytanie zadane 29 kwietnia 2020 w Python przez Kubs Mądrala (5,190 p.)
0 głosów
0 odpowiedzi 237 wizyt
pytanie zadane 21 kwietnia 2023 w Python przez tonn204 Mądrala (7,440 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...