मैं Django कुरकुरा रूपों के साथ स्वरूपण करने की कोशिश कर रहा हूँ, लेकिन इसे सहेजना संभव नहीं है।

पहले कुछ कोड:

Form.py

class CreateForm_test(forms.Form): 
    name = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Name'}))
    street = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Street'}))
    number = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Number'}))
    comment = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Comment'}))
    phone = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Phone'}))
    status = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Status'}))





class CrispyAddressForm(CreateForm_test):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.layout = Layout(
            Row(
                Column('name', css_class='form-group col-md-6 mb-0'),
                css_class='form-row'
            ),
            'street',
            'number',
            Row(
                Column('comment', css_class='form-group col-md-6 mb-0'),

                Column('phone', css_class='form-group col-md-2 mb-0'),
                Column('status', css_class='form-group col-md-2 mb-0'),


                css_class='form-row'
            ),

            Submit('submit', 'Submit')
        )

View.py

class CreateRegisterView(CreateView): 
    model = Register
    message = _("saved")
    form_class = CrispyAddressForm

    template_name = 'register_form.html'
    def form_valid(self, form):
        if self.request.user.is_authenticated:
            form.instance.user = self.request.user
        return super().form_valid(form)

    def get_success_url(self):
        messages.success(self.request, self.message)
        return reverse('home')

Register_form.html

{% extends 'base.html' %}

{% load crispy_forms_tags %}

{% block content %}
  {% crispy form %}
{% endblock %}

जब मैं अपने ब्राउज़र में फॉर्म खोलता हूं, तो मुझे यह त्रुटि मिली

forms.py", line 36, in __init__
    super().__init__(*args, **kwargs)
TypeError: __init__() got an unexpected keyword argument 'instance'
[29/Feb/2020 18:40:13] "GET /Register/create/ HTTP/1.1" 500 115893

मैंने भी कोशिश की वर्ग CreateRegisterView (फॉर्मव्यू): लेकिन फिर मुझे इस पंक्ति form.instance.user = self.request.user के विचारों में वही त्रुटि मिलती है

0
Icy Bix 29 फरवरी 2020, 20:45
आप ModelForm का उपयोग नहीं करते हैं, इसलिए कोई instance नहीं है।
 – 
Willem Van Onsem
29 फरवरी 2020, 20:48
ठीक है, लेकिन जब मैं रूपों में बदलता हूं। मॉडलफॉर्म, तो मैं फॉर्म देख सकता हूं लेकिन इसकी बचत नहीं हो रही है। जब मैं सबमिट बटन पर क्लिक करता हूं, तो साइट पुनः लोड हो रही है, लेकिन कुछ भी सहेजा नहीं गया है
 – 
Icy Bix
29 फरवरी 2020, 20:55
जब आप फॉर्म जमा करते हैं तो क्या आपको कोई POST अनुरोध दिखाई देता है?
 – 
Willem Van Onsem
29 फरवरी 2020, 20:59
हां, जब मैं मॉडलफॉर्म में बदलता हूं, तो मैं अपने ब्राउज़र में फॉर्म देख सकता हूं, लेकिन यह सहेज नहीं रहा है
 – 
Icy Bix
29 फरवरी 2020, 21:13
लेकिन यदि आप फ़ॉर्म को सबमिट करते हैं, तो उसे सर्वर कंसोल में एक POST अनुरोध लॉग करना चाहिए (ब्राउज़र नहीं)।
 – 
Willem Van Onsem
29 फरवरी 2020, 21:17

2 जवाब

समस्या यह है कि आपने एक <कोड>फॉर्म का उपयोग किया, नहीं एक <कोड>मॉडलफॉर्म। एक साधारण फॉर्म में कोई .instance नहीं होता है, और .save() के बारे में कुछ भी नहीं जानता है, क्योंकि फॉर्म< का कार्य होता है /code> बस GET या POST डेटा को प्रोसेस करने और सत्यापन और सफाई करने के लिए है। ModelForm जो कि किसी फॉर्म के ऊपर बना होता है, मॉडल ऑब्जेक्ट को लोड, अपडेट और सेव कर सकता है। इस प्रकार आपको एक ModelForm से उपवर्ग करना चाहिए, और एक Meta प्रदान करना चाहिए:

class CreateForm_test(forms.ModelForm): 
    name = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Name'}))
    street = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Street'}))
    number = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Number'}))
    comment = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Comment'}))
    phone = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Phone'}))
    status = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Status'})

    class Meta:
        model = Register
        fields = ['name', 'street', 'number', 'comment', 'phone', 'status']

इसके अलावा जैसा कि दस्तावेज़ीकरण में निर्दिष्ट किया गया है, आपको यह करना होगा सहायक में कार्रवाई निर्दिष्ट करें:

class CrispyAddressForm(CreateForm_test):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_action = 'name_of_createview'
        self.helper.layout = Layout(
            Row(
                Column('name', css_class='form-group col-md-6 mb-0'),
                css_class='form-row'
            ),
            'street',
            'number',
            Row(
                Column('comment', css_class='form-group col-md-6 mb-0'),

                Column('phone', css_class='form-group col-md-2 mb-0'),
                Column('status', css_class='form-group col-md-2 mb-0'),


                css_class='form-row'
            ),

            Submit('submit', 'Submit')
        )
0
Willem Van Onsem 29 फरवरी 2020, 21:43

मुझे लगता है, मुख्य मुद्दा यह है कि मैंने खेतों को दो बार परिभाषित किया है। एक बार मॉडलों में और एक बार मेरे रूपों में।

अब यह काम कर रहा है: प्रपत्र

class CreateForm_test(forms.ModelForm):
    class Meta:
        model = Register
        fields = ['name', 'street', 'number', 'comment', 'phone', 'status']



class CrispyAddressForm(CreateForm_test):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.layout = Layout(
             Row(
                 Column('name', css_class='form-group col-md-7 mb-0'),
                css_class='form-row'
            ),
            Row(
                Column('street', css_class='form-group col-md-6 mb-0'),
                Column('number', css_class='form-group col-md-1 mb-0'),
                css_class='form-row'
            ),

            Row(
                Column('comment', css_class='form-group col-md-6 mb-0'),
                css_class='form-row'
            ),
            Row(
                Column('phone', css_class='form-group col-md-6 mb-0'),
                css_class='form-row'
            ),
            Submit('submit', 'Submit')
        )

विचारों

class CreateRegisterView(CreateView):
    model = Register
    message = _("saved")
    form_class = CreateForm
    template_name = 'register_form.html'
    def form_valid(self, form):
        if self.request.user.is_authenticated:
            form.instance.user = self.request.user
        return super().form_valid(form)

    def get_success_url(self):
        messages.success(self.request, self.message)
        return reverse('home')

मॉडल

class Register(models.Model):
    CREATED = "C"
    DELETED = "D"
    STATUS = (
        (CREATED, _("Created")),
        (DELETED, _("Deleted")),
    )
    user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, related_name="author", on_delete=models.SET_NULL, default=1)
    timestamp = models.DateTimeField(auto_now=True)
    created_at = models.DateTimeField(default=datetime.now)
    status = models.CharField(max_length=1, choices=STATUS, default=CREATED)
    comment = models.CharField(max_length=42, null=True, unique=False, blank=True)
    edited = models.BooleanField(default=False)
    objects = ArticleQuerySet.as_manager()
    name = models.CharField(max_length=35, null=True, unique=False)
    street = models.CharField(max_length=42, null=True, unique=False, blank=True)
    number = models.CharField(blank=True, null=True, max_length=6)
    phone = models.CharField(max_length=15, blank=True, null=True)
    zip = models.CharField(max_length=42, null=True, unique=False, blank=True)
    city = models.CharField(max_length=42, null=True, unique=False, blank=True)
    class Meta:
        verbose_name = _("Register")
        verbose_name_plural = _("Register")
        ordering = ("-timestamp",)

    def __str__(self):
        return self.name

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)

एचटीएमएल

{% extends 'base.html' %}

{% load crispy_forms_tags %}

{% block content %}
  {% crispy form %}
{% endblock %}

समझने के लिए, क्रिस्पीफॉर्म के साथ मेरे पास फॉर्म को फॉर्मेट करने के दो विकल्प हैं। पहला यह रूपों के साथ है और दूसरा html में प्रत्यक्ष है।

जब मैं विचारों में form_class = CreateForm_test और html . में बदलता हूं

{% extends 'base.html' %}

{% load crispy_forms_tags %}

{% block content %}
  <form method="post" novalidate>
    {% csrf_token %}
    <div class="form-row">
      <div class="form-group col-md-6 mb-0">
        {{ form.name|as_crispy_field }}
      </div>
    </div>
    <button type="submit" class="btn btn-primary">Submit</button>
  </form>
{% endblock %}

फिर अब काम नहीं कर रहा है, फॉर्म में पहला उदाहरण स्वरूपण काम कर रहा है। दूसरे एचटीएमएल में मैंने केवल फ़ील्ड name जोड़ा है, क्योंकि केवल यह एक अनिवार्य फ़ील्ड है।

क्या अंतर है कि html-स्वरूपण कार्य नहीं करता है? प्रपत्र ब्राउज़र में दिखाई दे रहा है लेकिन सहेज नहीं रहा है, कोई त्रुटि नहीं है।

0
Icy Bix 1 मार्च 2020, 10:17