2017-05-24 6 views
1

장고에 파일을 저장하는 데 문제가 있습니다. Pls 누군가가 나를 도울 수 있습니까?장고에서 여러 이미지를 저장할 때의 문제

2 필드 : descriptionimage이있는 양식이 있습니다. 이미지 필드 사용자는 여러 이미지를로드 할 수 있습니다. 이미지 필드를 만들려면 django-multiupload 앱을 사용했습니다. 또한 아약스에 의해 서버에 데이터를로드합니다. 다음 코드를 시도했지만 오류가 발생합니다. 이 문제를 해결하는 방법? 이미지 파일 저장 문제. article = article_form.save(commit=False)

models.py :

class Article(models.Model): 
    project = models.ForeignKey(Project, on_delete=models.CASCADE) 
    description = models.TextField(_('Description')) 

class Image(models.Model): 
    article= models.ForeignKey(Article, on_delete=models.CASCADE) 
    image = models.FileField(_('Image'), upload_to='images/%Y/%m/%d/') 

forms.py :

class ArticleForm(forms.ModelForm): 
    class Meta: 
     model = Article 
     fields = ('description',) 

    image = MultiFileField() 

    def save(self, commit=True): 
     instance = super(ArticleForm, self).save(commit) 
     for each in self.cleaned_data['image']: 
      Image.objects.create(image=each, article=instance) 
     return instance 

views.py : 역 추적에서 나는 볼이 라인에서 시작이 문제를 이해

def article_add(request, project_id): 
    data = dict() 
    project = get_object_or_404(Project, pk=project_id) 
    if request.method == 'POST': 
     article_form = ArticleForm(request.POST, request.FILES) 
     if article_form.is_valid(): 
      article = article_form.save(commit=False) 
      article.project = project 
      article.save() 
      data['form_is_valid'] = True 
      articles = Article.objects.all 
      context = {'articles': articles} 
      context.update(csrf(request)) 
      data['html_article'] = render_to_string('project/article_list.html', context) 
     else: 
      data['form_is_valid'] = False 
    else: 
     article_form = ArticleForm() 
    context = {'article_form': article_form} 
    data['html_article_form'] = render_to_string('project/article_add.html', context, request=request) 
    return JsonResponse(data) 
,515,

JS :

$(function() { 
    var loadForm = function() { 
     var btn = $(this); 
     $.ajax({ 
      url: btn.attr("data-url"), 
      type: 'get', 
      dataType: 'json', 
      beforeSend: function() { 
       $("#modal").modal("show"); 
      }, 
      success: function (data) { 
       $("#modal .modal-content").html(data.html_article_form); 
      } 
     }); 
    }; 

    var saveForm = function() { 
     var form = $(this); 
     var dataForm = new FormData(form.get(0)); 
     $.ajax({ 
      url: form.attr("action"), 
      data: dataForm 
      type: form.attr("method"), 
      dataType: 'json', 
      success: function (data) { 
       if (data.form_is_valid) { 
        $("#article-list").html(data.html_article); 
        $("#modal").modal("hide"); 
       } 
       else { 
        $("#modal .modal-content").html(data.html_article_form); 
       } 
      } 
     }); 
     return false; 
    }; 

    // Create Article 
    $("#article-add-button").click(loadForm); 
    $("#modal").on("submit", ".js-article-add-form", saveForm); 

    // Update Article 
    $("#article-list").on("click", "#js-edit-article-button", loadForm); 
    $("#modal").on("submit", ".js-article-edit-form", saveForm); 
}); 

ERROR : 외래 키가 존재하지 않는 것을 보여주는 intergrity 오류의

Traceback (most recent call last): 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\handlers\exception.py", line 39, in inner 
    response = get_response(request) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\reversion\revisions.py", line 296, in do_revision_context 
    return func(*args, **kwargs) 
    File "C:\Users\Nurzhan\PycharmProjects\RMS\project\views.py", line 1673, in article_add 
    article = article_form.save(commit=False) 
    File "C:\Users\Nurzhan\PycharmProjects\RMS\project\forms.py", line 271, in save 
    Image.objects.create(image=each, article=instance) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\db\models\manager.py", line 85, in manager_method 
    return getattr(self.get_queryset(), name)(*args, **kwargs) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\db\models\query.py", line 399, in create 
    obj.save(force_insert=True, using=self.db) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\db\models\base.py", line 796, in save 
    force_update=force_update, update_fields=update_fields) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\db\models\base.py", line 824, in save_base 
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\db\models\base.py", line 908, in _save_table 
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\db\models\base.py", line 947, in _do_insert 
    using=using, raw=raw) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\db\models\manager.py", line 85, in manager_method 
    return getattr(self.get_queryset(), name)(*args, **kwargs) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\db\models\query.py", line 1045, in _insert 
    return query.get_compiler(using=using).execute_sql(return_id) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\db\models\sql\compiler.py", line 1054, in execute_sql 
    cursor.execute(sql, params) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\db\backends\utils.py", line 79, in execute 
    return super(CursorDebugWrapper, self).execute(sql, params) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\db\backends\utils.py", line 64, in execute 
    return self.cursor.execute(sql, params) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\db\utils.py", line 94, in __exit__ 
    six.reraise(dj_exc_type, dj_exc_value, traceback) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\utils\six.py", line 685, in reraise 
    raise value.with_traceback(tb) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\db\backends\utils.py", line 64, in execute 
    return self.cursor.execute(sql, params) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\sql_server\pyodbc\base.py", line 539, in execute 
    return self.cursor.execute(sql, params) 
django.db.utils.IntegrityError: ('23000', '[23000] [Microsoft][ODBC SQL Server Driver][SQL Server]�������� ���������� INSERT � ������������ FOREIGN KEY "project_image_article_id_1cd62783_fk_project_article_id". �������� ��������� � ���� ������ "RMS", ������� "dbo.project_article", column \'code\'. (547) (SQLExecDirectW)') 

답변

1

. 이 코드에서 유래합니다.

def save(self, commit=True): 
    instance = super(ArticleForm, self).save(commit) 
    for each in self.cleaned_data['image']: 
     Image.objects.create(image=each, article=instance) 
    return instance 

처음 양식 저장 메서드를 호출하면 문서가 저장되지 않고 수행됩니다. 즉, 기사에는 PK가 없습니다. 이미지가 외래 키에 대한 참조 intergrity 규칙을 따르지 않는다는 것을 의미합니다.

이 비트를보기로 이동하면 다음과 같이 보일 것입니다.

if article_form.is_valid(): 
     article = article_form.save(commit=False) 
     article.project = project 
     article.save() 
     for each in article_form.cleaned_data['image']: 
      Image.objects.create(image=each, article=instance) 

기사가 커밋 된 후에 실행하십시오.

+0

안녕하세요! 나는 또한 볼 수있는 이미지 객체를 만드는 코드를 움직이는 것에 대해 생각했지만 올바르게 만드는 법을 이해하지 못했습니다. 나는 정말 혼란 스럽다. 어떻게 만드는지 보여 줄 수 있어요? 보기에서'specification.save()'다음에 그 코드를 추가하기 만하면됩니까? –

+0

pls 업데이트를 확인하십시오 – e4c5

+0

예, 당신이 옳았습니다. 마지막 업데이트 전에 똑같은 일을했고 내 문제를 해결했습니다. 어쨌든 고맙습니다. 나는 다른 문제가있다. 편집 기사에 동일한 양식을 사용합니다. 문제는 편집 양식을 열었을 때 이미지 필드에 이미지가 없지만 설명 필드에 현재 데이터가 표시되는 것과 같습니다. 이 새로운 문제를 해결할 수 있도록 도울 수 있습니까? 내가보기에서 사용 :'article_form = ArticleForm (request.POST, request.FILES, instance = article)' –