• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    해결됨

섬머노트가 적용이 안됩니다..

22.05.15 19:43 작성 조회수 554

0

보드 앱은 안만들었습니다. 그냥 포스트 작성할 때

섬머노트를 적용하려고 하는데요. 

Specifying both 'fields' and 'form_class' is not permitted.

에러가 발생합니다.

 

blog / form.py

from django import forms
from .models import Post
from django_summernote.widgets import SummernoteWidget


class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ['title', 'content']
        widgets = {
            'content': SummernoteWidget()
      }

blog / models.py

class Post(models.Model):
  title = models.CharField(max_length=50)
  content = models.TextField()
   
  created_at = models.DateTimeField(auto_now_add=True)
  updated_at = models.DateTimeField(auto_now=True)
   
  author = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)
  category = models.ForeignKey(Category, null=True, blank=True, on_delete=models.SET_NULL)
  tags = models.ManyToManyField(Tag, blank=True)

  def __str__(self):
    return f'{self.pk} / {self.title} :: {self.author}'
   
  def get_absolute_url(self):
    return f'/study/{self.pk}/'

blog / views.py

class PostCreate(LoginRequiredMixin, UserPassesTestMixin, CreateView):
  model = Post
  fields = ['title', 'content', 'category']
  form_class = PostForm
 
  def get_context_data(self, **kwargs):
    context = super(PostCreate, self).get_context_data()
    context['categories'] = Category.objects.all()
    context['no_category_post_count'] = Post.objects.filter(category=None).count()
    return context
 
  # UserPassesTestMixin를 만족시키기 위한 함수
  def test_func(self):
    return self.request.user.is_authenticated or self.request.user.is_staff  

  # 유효성 검사
  def form_valid(self, form):
    current_user = self.request.user
    if current_user.is_authenticated and (current_user.is_staff or current_user.is_superuser):
      form.instance.author = current_user
      response = super(PostCreate, self).form_valid(form)
     
      #  1. PostCreate라는 클래스가 Submit 버튼을 통해서 POST 형태로 전송될 때 get을 해서 특정 값을 가져온다.
      #  그리고 그것을 tags_str에 담는다.
      #  2. get('tags_str')이 html 파일에서 태그를 입력한 input 태그의 name과 같은 값이어야 한다.
      #  3. 입력된 tag 값을 포매팅 후 리스트에 담는다.
      #  4. 반복문을 통해서 태그를 구분하고 태그를 기존 태그와 아닌 것으로 구분 후 아니라면 새로 생성한다.
      #  5. 새로 생성한 태그는 slug를 직접 입력 후 저장한다.
      #  6. 생성된 객체에 태그를 추가한다.
      tags_str = self.request.POST.get('tags_str')
      if tags_str:
        tags_str = tags_str.strip()
        tags_str = tags_str.replace(',', ';')
        tags_list = tags_str.split(';')
       
        for t in tags_list:
          t = t.strip()
          tag, is_tag_created = Tag.objects.get_or_create(name=t)
          if is_tag_created:
            tag.slug = slugify(t, allow_unicode=True)
            tag.save()
          self.object.tags.add(tag)
      return response
    else:
      return redirect('/study/')

코드 내용은 이렇습니다..

오늘 부트스트랩 안쓰고 UiKIT 써서 한다고 하다가 crispy 적용시킬 때 안되가지고 구글링 미친듯이 하면서 forms 사용법 배우다가 결국 못했는데 포기하고 부트스트랩 적용시키고 나서 이번엔 섬머노트 적용시키려고 하니까 이번에도 form이 절 괴롭히네요...12시간 코딩해서 막히는 구간 뚫었을 때는 정말 기쁜데 이렇게 또 막히고 답을 모르니 막막하네요...ㅠ

답변 좀 주시면 감사하겠습니다..

forms.py 에서 fields를 field로 적으면 오류가 납니다.

django.core.exceptions.ImproperlyConfigured: Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is prohibited; form PostForm needs updating.

답변 2

·

답변을 작성해보세요.

0

해결했습니다..

views.py에서 

# fields = ['title', 'content', 'category']
  form_class = PostForm

처럼 fields를 주석처리 하니까 되네요..

fields하고 foms.py에서 정의된 fields 와 충돌하는 것이 아닐까 추측해봅니다.

충돌 나는 것을 막아보기 위해서 view.py에서 fields를 주석처리하지 않고

forms.py 에서 fields라고 작성한걸 field로 바꾸면 똑같이

Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is prohibited; form PostForm needs updating. 

에러가 나네요..그래서 그냥 fields로 놔두고 views.py에서 fields를 주석처리했습니다.

 

그리고 강의에서는 content 입력 란이 iframe 때문에 문제가 발생했었는데 저는 그런 문제가 생기지 않네요..

summernote쪽에서 문제를 수정한걸까요...?

아무튼 해결했습니다.

 

0

그런데 왜 forms.py에서 fields를 field로 적으시려는거죠? 

강의에서 그렇게 하셨어요

그리고 그 오류는 fields로 적어서 해결하면 상관없는데 맨 위에 오류가 해결이 안됩니다..