0

Ich bin auf der Suche nach der Lösung für dieses Problem. Ich habe ein Modell namens "Album", wo bestimmte Felder Standardwerte zugewiesen werden müssen, wenn sie nicht manuell angegeben werden. Nach all den Nachforschungen fühlt es sich an, als wäre mein Code korrekt, aber Standardwerte werden nicht zugewiesen. Außerdem stelle ich zum ersten Mal eine Frage zu stackoverflow, also bitte mit meiner Neuigkeit. Hier sind alle Codes:Django Standardwert wird nicht zugewiesen! django 1.11 python 3.6

models.py Datei:

class Album(models.Model): 
    artist = models.CharField(max_length = 250, blank = True, null = True, default = "some_default_artist_name") 
    album_title = models.CharField(max_length = 500, default='some_default_album_name', blank = True, null = True) 
    genre = models.CharField(max_length = 100) 
    album_logo = models.FileField() 
    date_field = models.DateField() 
    dt_field = models.DateField(blank = True, null = True, default=date.today().strftime('%d/%m/%Y')) 

forms.py Datei:

class AlbumForm(forms.ModelForm): 
    artist = forms.CharField(required = False) 
    album_title = forms.CharField(required = False) 
    genre = forms.CharField() 
    album_logo = forms.FileField() 
    date_field = forms.DateField(widget = forms.DateInput(attrs={'placeholder': 'dd/mm/yyyy'}, format='%d/%m/%Y')) 
    dt_field = forms.DateField(required = False, widget = forms.DateInput(attrs={'placeholder': 'dd/mm/yyyy'}, format='%d/%m/%Y')) 

    class Meta: 
     model = Album 
     fields = '__all__' 

Es wird erwartet, dass die Standardwerte zu 'Künstler' zugeordnet werden, 'ALBUM_TITLE' und 'dt_field', wenn diese Felder im Formular leer gelassen werden. Keines der Felder wird Standardwerte zugewiesen und bleibt null, es sei denn, es wird initialisiert.

views.py:

class AlbumCreate(LoginRequiredMixin, SuccessMessageMixin, CreateView): 
    login_url = 'music:login' 
    form_class = AlbumForm 
    redirect_field_name = None 
    #fields = '__all__' 
    model = Album 
    success_message = "Album was created successfully" 

Auch wenn dieser Ansatz nicht richtig ist, was der richtige Ansatz sein könnte ??

Antwort

0

EDIT: (Gelöst)

So aus irgendeinem seltsamen unbekannten Grund der Standardparameter einfach nicht funktioniert, aber die Antwort dirkgroten mich hat inspirieren, einen anderen Ansatz zu folgen, was ich früher folgen.

So, hier sind die neuen Arbeitscodes für in einer ähnlichen Situation wie meine stecken jene:

models.py: (Entfernt alle unnötigen paramters)

class Album(models.Model): 
    artist = models.CharField(max_length = 250) 
    album_title = models.CharField(max_length = 500) 
    genre = models.CharField(max_length = 100) 
    album_logo = models.FileField() 
    date_field = models.DateField() 
    dt_field = models.DateField() 

forms.py: (Keine Änderung

)
class AlbumForm(forms.ModelForm): 
    artist = forms.CharField(required = False) 
    album_title = forms.CharField(required = False) 
    genre = forms.CharField() 
    album_logo = forms.FileField() 
    date_field = forms.DateField(widget = forms.DateInput(attrs={'placeholder': 'dd/mm/yyyy'}, format='%d/%m/%Y')) 
    dt_field = forms.DateField(required = False, widget = forms.DateInput(attrs={'placeholder': 'dd/mm/yyyy'}, format='%d/%m/%Y')) 

    class Meta: 
     model = Album 
     fields = '__all__' 

und schließlich views.py: (Überschreiben der def_valid Methode von Create)

class AlbumCreate(LoginRequiredMixin, SuccessMessageMixin, CreateView): 
    login_url = 'music:login' 
    model = Album 
    form_class = AlbumForm 
    redirect_field_name = None  
    success_message = "Album was created successfully" 

    def date_in_range(self, x): #basic function to check if a date is within a date range. Returns True if date is within the date range else false. 
     start = date(2000, 12, 31) 
     end = date(2017, 12, 31) 
     if start <= end: 
      return start <= x <= end 
     else: 
      return start <= x or x <= end 


    def form_valid(self, form): 
     obj = form.save(commit = False) 
     if not obj.artist: #if artist field left blank, assign this value 
      obj.artist = 'Default_artist_name' 
     if not obj.dt_field: #if dt_field left blank, assign this value 
      obj.dt_field = date.today() 
     if not self.date_in_range(obj.dt_field): #if entered date is not in range, then display a field error for dt_field. 
      form.add_error('dt_field', 'Date out of range') 
      return super(AlbumCreate, self).form_invalid(form) 
     self.object = form.save() 
     return super(AlbumCreate, self).form_valid(form) 

Auch alle Anregungen oder Feedback ist immer willkommen. Danke :)

1

Das liegt daran, dass Django keinen Grund hat, den Standardwert zuzuweisen, da Ihr Modell blank=True erlaubt. Wenn Sie möchten, dass Ihre Modelle immer den Standardwert enthalten, wenn sie nicht angegeben sind, legen Sie Ihre Felder nicht auf blank=True fest. Verwenden Sie auch nicht null=True auf einem CharField, da dies zwei leere Darstellungen in der Datenbank ermöglicht. So haben Sie zwei Möglichkeiten:

  1. Ändern Sie Ihr Modell:

    artist = models.CharField(max_length=250, default="some_default_artist_name") 
    
  2. Ordnen Sie den Standardwert bei Formularvalidierung:

    def clean_artist(self): 
         if not self.cleaned_data.get('artist'): 
          cleaned_data['artist'] = "default_artist_name" 
    

Siehe auch this SO question.

Verwandte Themen