2017-01-29 2 views
0

Hallo Ich baue meinen eigenen Blog und ich habe versucht, Fotos zu meinen Blog-Posts hinzuzufügen. Momentan kann ich Fotos in den Ordner Medien/Dokumente hochladen, aber ich habe Probleme, diese Fotos Posts zuzuordnen. DieseDjango Modell Nullwert Feld Fehler Makemigrationen

ist, wie mein models.py sieht aus wie

class Document(models.Model): 
    post = models.ForeignKey('blog.Post', related_name='documents', null = True) 
    description = models.CharField(max_length=255, blank=True) 
    document = models.FileField(upload_to='documents/') 
    uploaded_at = models.DateTimeField(auto_now_add=True) 

    def __str__(self): 
     return self.text 

forms.py

class DocumentForm(forms.ModelForm): 
class Meta: 
    model = Document 
    fields = ('description', 'document') 

views.py

@login_required 
def model_form_upload(request, pk): 
    post = get_object_or_404(Post, pk=pk) 
    if request.method == 'POST': 
     form = DocumentForm(request.POST, request.FILES) 
     if form.is_valid(): 
      form.post = post 
      form.save() 
      return redirect('/') 
    else: 
     form = DocumentForm() 
    return render(request, 'blog/model_form_upload.html', { 'form': form }) 

innen post_detail.html

{% for document in post.documents.all %} 
<div style="padding: 10px;"> 
    <p> {{ document.description }} </p> 
    <img src=""/> 
</div> 
{% endfor %} 

...

{% if user.is_authenticated %} 
    <a class="btn btn-default" href="{% url 'model_form_upload' pk=post.pk %}">Add photo</a> 
{% endif %} 

Denn jetzt, ich versuche, die Beschreibung ausdrucken und dann mit dem Urls Umgang einfacher sein. Die Fotos werden hochgeladen, sie sind nicht mit den Posts verbunden. Wenn ich die null = True entferne, kann ich makemigrations auf der Befehlszeile nicht übergeben. Kann mir jemand helfen, was hier nicht stimmt?

edit: Wenn es hilft, hat die Kommentare Klasse die gleiche Codezeile, funktioniert aber immer noch ganz gut:

models.py

class Comment(models.Model): 
    post = models.ForeignKey('blog.Post', related_name='comments') 
    author = models.CharField(max_length=200) 
    text = models.TextField() 
    created_date = models.DateTimeField(default=timezone.now) 
    approved_comment = models.BooleanField(default=False) 

    def approve(self): 
     self.approved_comment = True 
     self.save() 

    def __str__(self): 
     return self.text 

forms.py

class CommentForm(forms.ModelForm): 

    class Meta: 
     model = Comment 
     fields = ('author', 'text') 

Antwort

0

Ihr DocumentForm hat kein post Attribut, also weiß es nicht, wie man es speichert.

in Ihre DocumentForm alle Felder außer post:

class DocumentForm(ModelForm): 
    class Meta: 
     model = Document 
     exclude = ['post'] 

Dann in der Ansicht, gehen Sie wie folgt vor:

@login_required 
def model_form_upload(request, pk): 
    post = get_object_or_404(Post, pk=pk) 
    if request.method == 'POST': 
     form = DocumentForm(request.POST, request.FILES) 
     if form.is_valid(): 
      document = form.save(commit=False) 
      document.post = post 
      document.save() 
      return redirect('/') 
    else: 
     form = DocumentForm() 
    return render(request, 'blog/model_form_upload.html', { 'form': form }) 
+0

Vielen Dank für die Antwort es funktioniert! Irgendwelche Ideen, wie man das Bild anzeigt? Ich muss auf die URL zugreifen, aber wie kann ich es tun? Die Dateien werden derzeit unter dem gleichen Namen gespeichert, den sie hochgeladen haben, sollte ich sie in irgendeiner Form speichern und sie dann im HTML-Tag übergeben? – Deniz

+0

'' Ich habe dies versucht, um die Bilder aufzunehmen, aber ich bekomme stattdessen ein gebrochenes Bild – Deniz

+0

Wenn Sie nur Bilder hochladen möchten, können Sie 'ImageField' anstelle von' FileField' verwenden. Und versuchen Sie dies für das Rendern von Image-Link: '' – afilardo

Verwandte Themen